人生理想,技术交流加Q:411239339

Day 05 文件查找与压缩归档

浏览:21次阅读
没有评论

共计 3169 个字符,预计需要花费 8 分钟才能阅读完成。

在 Linux 系统里,找到一个文件和把一堆文件打包带走,是两件你几乎每天都会干的事。听起来简单,但真要用好,里面的门道不少。这篇文章把文件查找和压缩归档这两件事讲透,看完你就能应对绝大多数实际场景。

文件查找:四个命令各有分工

很多人只知道 find,其实 Linux 提供了好几个查找命令,它们解决的问题完全不同。先搞清楚谁是谁,再决定用哪个。

which——找可执行程序的位置

which 只做一件事:告诉你当前敲的命令,实际执行的是哪个文件。它只在 $PATH 环境变量指定的目录里找。

which python3
# /usr/bin/python3

which -a python3
# 加 -a 会列出 PATH 中所有匹配的路径,而不仅是第一个

适用场景:系统里装了多个版本的同一软件,你想确认到底在跑哪个。

whereis——找命令的 " 全家福 "

whereiswhich 多走一步,它不仅找可执行文件,还会顺带找出该命令的手册页(man page)和源码位置。

whereis gcc
# gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz

适用场景:你想快速了解某个命令的相关文件分布在哪些目录。

locate——靠数据库 " 秒查 "

locate 不会真的去磁盘上搜,它查的是一个预先建好的文件名数据库(通常是 mlocate.db)。所以它特别快,但有个前提——数据库得是最新的。

# 先更新数据库(需要 root 权限)sudo updatedb

# 查找包含 "nginx.conf" 的文件路径
locate nginx.conf

# 忽略大小写
locate -i readme.md

坦白说,locate 的速度优势在大规模文件系统上非常明显。但它的短板也很直接:新创建的文件在 updatedb 之前是搜不到的。

find——最强也最复杂

find 是真正的 " 全能选手 "。它实时遍历目录树,支持按名称、类型、大小、时间、权限等几十种条件组合查找,还能对找到的文件直接执行操作。

按名称查找:

# 在 /etc 下找名为 passwd 的文件
find /etc -name "passwd"

# 忽略大小写
find /home -iname "*.jpg"

按类型查找:

# 只找目录
find /var/log -type d

# 只找普通文件
find /tmp -type f

按大小查找:

# 找大于 100MB 的文件
find / -size +100M

# 找小于 1KB 的文件
find . -size -1k

按时间查找:

# 7 天内修改过的文件
find /home -mtime -7

# 超过 30 天没访问的文件
find /var/log -atime +30

组合条件:

# 找 /tmp 下超过 7 天且大于 10MB 的日志文件
find /tmp -name "*.log" -mtime +7 -size +10M

找到后直接处理:

这是 find 最强大的地方——用 -exec 对结果执行命令。

# 删除 30 天前的临时文件
find /tmp -type f -mtime +30 -exec rm -f {} \;

# 把找到的文件统一改权限
find /var/www -type f -exec chmod 644 {} \;

# 用 xargs 配合(性能更好,批量处理)find . -name "*.log" | xargs grep "ERROR"

{} 是占位符,代表每个找到的文件;\; 表示命令结束。如果文件数量很大,换用 xargs 会更高效,因为它把多个文件名拼成一条命令执行,减少了进程创建的开销。

四个命令怎么选? 一句话总结:找命令用 which/whereis,快速模糊搜用 locate,精确条件搜用 find

压缩归档:先分清 " 打包 " 和 " 压缩 "

很多人把这两个概念混在一起,但它们是两步操作。打包 是把多个文件合并成一个文件(不改变总大小),压缩 是用算法减小文件体积。tar 负责打包,而 gzipbzip2xz 负责压缩。当然,tar 可以在打包的同时调用压缩工具,一步到位。

tar——打包的核心工具

tar 的名字来自 Tape Archive(磁带归档),虽然磁带已经是上个时代的东西了,但这个命令活得比谁都好。

几个必记参数:

参数 含义
-c 创建归档(Create)
-x 解包(Extract)
-v 显示过程(Verbose)
-f 指定文件名(File)
-z 用 gzip 压缩
-j 用 bzip2 压缩
-J 用 xz 压缩
-t 查看归档内容(不解包)

常用操作:

# 仅打包,不压缩
tar -cvf archive.tar /path/to/directory

# 打包 + gzip 压缩(最常见)tar -czvf archive.tar.gz /path/to/directory

# 打包 + bzip2 压缩(压缩率更高,速度更慢)tar -cjvf archive.tar.bz2 /path/to/directory

# 打包 + xz 压缩(压缩率最高,速度最慢)tar -cJvf archive.tar.xz /path/to/directory

# 解包 tar.gz
tar -xzvf archive.tar.gz

# 解包到指定目录
tar -xzvf archive.tar.gz -C /target/directory

# 只看看里面有什么,不真的解包
tar -tzvf archive.tar.gz

有个小技巧:解压时其实可以不指定 -z/-j/-J,现代版本的 tar 能自动识别压缩格式。但写脚本时建议还是显式指定,避免在老系统上翻车。

三种压缩算法对比

这三个工具可以单独使用,也可以被 tar 调用。它们的核心区别就是速度和压缩率的取舍。

工具 扩展名 压缩率 速度 适用场景
gzip .gz 一般 日常使用,日志压缩
bzip2 .bz2 较高 较慢 需要更好压缩率时
xz .xz 最高 最慢 软件发布包、长期归档
# 单独压缩(注意:会删除原文件)gzip file.txt        # 生成 file.txt.gz
bzip2 file.txt       # 生成 file.txt.bz2
xz file.txt          # 生成 file.txt.xz

# 解压
gunzip file.txt.gz   # 或 gzip -d file.txt.gz
bunzip2 file.txt.bz2
unxz file.txt.xz

# 保留原文件(加 -k 参数)gzip -k file.txt
xz -k file.txt

怎么选?日常操作选 gzip,够快够用。需要传输大文件、带宽紧张时考虑 bzip2xz。发布开源软件的源码包,社区惯例用 xz

zip/unzip——跨平台首选

跟 Windows 和 macOS 用户交换文件时,zip 格式是最省心的选择。它同时完成打包和压缩,不需要像 tar 那样分两步理解。

# 压缩
zip -r archive.zip /path/to/directory

# 解压
unzip archive.zip

# 解压到指定目录
unzip archive.zip -d /target/directory

# 查看内容
unzip -l archive.zip

# 设置密码
zip -r -P your_password archive.zip /path/to/directory

-r 参数表示递归压缩子目录,压缩目录时别忘了加。

实战组合:查找 + 压缩

这两类命令经常配合使用。比如运维中一个典型场景——找出 30 天前的日志文件并打包归档:

# 找到旧日志,打包后删除原文件
find /var/log -name "*.log" -mtime +30 -print0 | \
  xargs -0 tar -czvf old_logs_$(date +%Y%m%d).tar.gz

# 确认打包成功后,再删除原文件
find /var/log -name "*.log" -mtime +30 -delete

-print0 配合 xargs -0 是为了正确处理文件名中包含空格的情况,这个习惯值得养成。

说到底,文件查找和压缩归档这些命令,单个拿出来都不难。真正体现水平的是根据实际场景把它们组合起来用——找到目标文件,按条件过滤,然后批量处理。多敲几次,手感自然就有了。

正文完
创作不易,扫码加点动力
post-qrcode
 0
果较瘦
版权声明:本站原创文章,由 果较瘦 于2026-03-23发表,共计3169字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。