共计 3580 个字符,预计需要花费 9 分钟才能阅读完成。
在 Linux 系统里,找到一个文件和把一堆文件打包带走,是两件你几乎每天都会干的事。听起来简单,但真要用好,里面的门道不少。这篇文章把文件查找和压缩归档这两件事讲透,看完你就能应对绝大多数实际场景。
## 文件查找:四个命令各有分工
很多人只知道 `find`,其实 Linux 提供了好几个查找命令,它们解决的问题完全不同。先搞清楚谁是谁,再决定用哪个。
### which——找可执行程序的位置
`which` 只做一件事:告诉你当前敲的命令,实际执行的是哪个文件。它只在 `$PATH` 环境变量指定的目录里找。
“`bash
which python3
# /usr/bin/python3
which -a python3
# 加 -a 会列出 PATH 中所有匹配的路径,而不仅是第一个
“`
适用场景:系统里装了多个版本的同一软件,你想确认到底在跑哪个。
### whereis——找命令的 ” 全家福 ”
`whereis` 比 `which` 多走一步,它不仅找可执行文件,还会顺带找出该命令的手册页(man page)和源码位置。
“`bash
whereis gcc
# gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz
“`
适用场景:你想快速了解某个命令的相关文件分布在哪些目录。
### locate——靠数据库 ” 秒查 ”
`locate` 不会真的去磁盘上搜,它查的是一个预先建好的文件名数据库(通常是 `mlocate.db`)。所以它特别快,但有个前提——数据库得是最新的。
“`bash
# 先更新数据库(需要 root 权限)
sudo updatedb
# 查找包含 “nginx.conf” 的文件路径
locate nginx.conf
# 忽略大小写
locate -i readme.md
“`
坦白说,`locate` 的速度优势在大规模文件系统上非常明显。但它的短板也很直接:新创建的文件在 `updatedb` 之前是搜不到的。
### find——最强也最复杂
`find` 是真正的 ” 全能选手 ”。它实时遍历目录树,支持按名称、类型、大小、时间、权限等几十种条件组合查找,还能对找到的文件直接执行操作。
** 按名称查找:**
“`bash
# 在 /etc 下找名为 passwd 的文件
find /etc -name “passwd”
# 忽略大小写
find /home -iname “*.jpg”
“`
** 按类型查找:**
“`bash
# 只找目录
find /var/log -type d
# 只找普通文件
find /tmp -type f
“`
** 按大小查找:**
“`bash
# 找大于 100MB 的文件
find / -size +100M
# 找小于 1KB 的文件
find . -size -1k
“`
** 按时间查找:**
“`bash
# 7 天内修改过的文件
find /home -mtime -7
# 超过 30 天没访问的文件
find /var/log -atime +30
“`
** 组合条件:**
“`bash
# 找 /tmp 下超过 7 天且大于 10MB 的日志文件
find /tmp -name “*.log” -mtime +7 -size +10M
“`
** 找到后直接处理:**
这是 `find` 最强大的地方——用 `-exec` 对结果执行命令。
“`bash
# 删除 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` 负责打包,而 `gzip`、`bzip2`、`xz` 负责压缩。当然,`tar` 可以在打包的同时调用压缩工具,一步到位。
### tar——打包的核心工具
`tar` 的名字来自 Tape Archive(磁带归档),虽然磁带已经是上个时代的东西了,但这个命令活得比谁都好。
** 几个必记参数:**
| 参数 | 含义 |
|——|——|
| `-c` | 创建归档(Create)|
| `-x` | 解包(Extract)|
| `-v` | 显示过程(Verbose)|
| `-f` | 指定文件名(File)|
| `-z` | 用 gzip 压缩 |
| `-j` | 用 bzip2 压缩 |
| `-J` | 用 xz 压缩 |
| `-t` | 查看归档内容(不解包)|
** 常用操作:**
“`bash
# 仅打包,不压缩
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` | 最高 | 最慢 | 软件发布包、长期归档 |
“`bash
# 单独压缩(注意:会删除原文件)
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`,够快够用。需要传输大文件、带宽紧张时考虑 `bzip2` 或 `xz`。发布开源软件的源码包,社区惯例用 `xz`。
### zip/unzip——跨平台首选
跟 Windows 和 macOS 用户交换文件时,`zip` 格式是最省心的选择。它同时完成打包和压缩,不需要像 `tar` 那样分两步理解。
“`bash
# 压缩
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 天前的日志文件并打包归档:
“`bash
# 找到旧日志,打包后删除原文件
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` 是为了正确处理文件名中包含空格的情况,这个习惯值得养成。
说到底,文件查找和压缩归档这些命令,单个拿出来都不难。真正体现水平的是根据实际场景把它们组合起来用——找到目标文件,按条件过滤,然后批量处理。多敲几次,手感自然就有了。