冒险岛079

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9|回复: 0

Day 05 文件查找与压缩归档

[复制链接]

613

主题

13

回帖

1961

积分

管理员

积分
1961
发表于 昨天 06:00 | 显示全部楼层 |阅读模式
在 Linux 系统里,找到一个文件和把一堆文件打包带走,是两件你几乎每天都会干的事。听起来简单,但真要用好,里面的门道不少。这篇文章把文件查找和压缩归档这两件事讲透,看完你就能应对绝大多数实际场景。

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

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

which——找可执行程序的位置
  1. which
复制代码
只做一件事:告诉你当前敲的命令,实际执行的是哪个文件。它只在
  1. $PATH
复制代码
环境变量指定的目录里找。
  1. which python3
  2. # /usr/bin/python3
  3. which -a python3
  4. # 加 -a 会列出 PATH 中所有匹配的路径,而不仅是第一个
复制代码

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

whereis——找命令的"全家福"
  1. whereis
复制代码
  1. which
复制代码
多走一步,它不仅找可执行文件,还会顺带找出该命令的手册页(man page)和源码位置。
  1. whereis gcc
  2. # gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz
复制代码

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

locate——靠数据库"秒查"
  1. locate
复制代码
不会真的去磁盘上搜,它查的是一个预先建好的文件名数据库(通常是
  1. mlocate.db
复制代码
)。所以它特别快,但有个前提——数据库得是最新的。
  1. # 先更新数据库(需要 root 权限)
  2. sudo updatedb
  3. # 查找包含 "nginx.conf" 的文件路径
  4. locate nginx.conf
  5. # 忽略大小写
  6. locate -i readme.md
复制代码

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

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

按名称查找:
  1. # 在 /etc 下找名为 passwd 的文件
  2. find /etc -name "passwd"
  3. # 忽略大小写
  4. find /home -iname "*.jpg"
复制代码

按类型查找:
  1. # 只找目录
  2. find /var/log -type d
  3. # 只找普通文件
  4. find /tmp -type f
复制代码

按大小查找:
  1. # 找大于 100MB 的文件
  2. find / -size +100M
  3. # 找小于 1KB 的文件
  4. find . -size -1k
复制代码

按时间查找:
  1. # 7 天内修改过的文件
  2. find /home -mtime -7
  3. # 超过 30 天没访问的文件
  4. find /var/log -atime +30
复制代码

组合条件:
  1. # 找 /tmp 下超过 7 天且大于 10MB 的日志文件
  2. find /tmp -name "*.log" -mtime +7 -size +10M
复制代码

找到后直接处理:

这是
  1. find
复制代码
最强大的地方——用
  1. -exec
复制代码
对结果执行命令。
  1. # 删除 30 天前的临时文件
  2. find /tmp -type f -mtime +30 -exec rm -f {} \;
  3. # 把找到的文件统一改权限
  4. find /var/www -type f -exec chmod 644 {} \;
  5. # 用 xargs 配合(性能更好,批量处理)
  6. find . -name "*.log" | xargs grep "ERROR"
复制代码
  1. {}
复制代码
是占位符,代表每个找到的文件;
  1. \;
复制代码
表示命令结束。如果文件数量很大,换用
  1. xargs
复制代码
会更高效,因为它把多个文件名拼成一条命令执行,减少了进程创建的开销。

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


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

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

tar——打包的核心工具
  1. tar
复制代码
的名字来自 Tape Archive(磁带归档),虽然磁带已经是上个时代的东西了,但这个命令活得比谁都好。

几个必记参数:

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

常用操作:
  1. # 仅打包,不压缩
  2. tar -cvf archive.tar /path/to/directory
  3. # 打包 + gzip 压缩(最常见)
  4. tar -czvf archive.tar.gz /path/to/directory
  5. # 打包 + bzip2 压缩(压缩率更高,速度更慢)
  6. tar -cjvf archive.tar.bz2 /path/to/directory
  7. # 打包 + xz 压缩(压缩率最高,速度最慢)
  8. tar -cJvf archive.tar.xz /path/to/directory
  9. # 解包 tar.gz
  10. tar -xzvf archive.tar.gz
  11. # 解包到指定目录
  12. tar -xzvf archive.tar.gz -C /target/directory
  13. # 只看看里面有什么,不真的解包
  14. tar -tzvf archive.tar.gz
复制代码

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

三种压缩算法对比

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

| 工具 | 扩展名 | 压缩率 | 速度 | 适用场景 |
|------|--------|--------|------|----------|
| gzip |
  1. .gz
复制代码
| 一般 | 快 | 日常使用,日志压缩 |
| bzip2 |
  1. .bz2
复制代码
| 较高 | 较慢 | 需要更好压缩率时 |
| xz |
  1. .xz
复制代码
| 最高 | 最慢 | 软件发布包、长期归档 |
  1. # 单独压缩(注意:会删除原文件)
  2. gzip file.txt        # 生成 file.txt.gz
  3. bzip2 file.txt       # 生成 file.txt.bz2
  4. xz file.txt          # 生成 file.txt.xz
  5. # 解压
  6. gunzip file.txt.gz   # 或 gzip -d file.txt.gz
  7. bunzip2 file.txt.bz2
  8. unxz file.txt.xz
  9. # 保留原文件(加 -k 参数)
  10. gzip -k file.txt
  11. xz -k file.txt
复制代码

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


zip/unzip——跨平台首选

跟 Windows 和 macOS 用户交换文件时,
  1. zip
复制代码
格式是最省心的选择。它同时完成打包和压缩,不需要像
  1. tar
复制代码
那样分两步理解。
  1. # 压缩
  2. zip -r archive.zip /path/to/directory
  3. # 解压
  4. unzip archive.zip
  5. # 解压到指定目录
  6. unzip archive.zip -d /target/directory
  7. # 查看内容
  8. unzip -l archive.zip
  9. # 设置密码
  10. zip -r -P your_password archive.zip /path/to/directory
复制代码
  1. -r
复制代码
参数表示递归压缩子目录,压缩目录时别忘了加。

实战组合:查找 + 压缩

这两类命令经常配合使用。比如运维中一个典型场景——找出 30 天前的日志文件并打包归档:
  1. # 找到旧日志,打包后删除原文件
  2. find /var/log -name "*.log" -mtime +30 -print0 | \
  3.   xargs -0 tar -czvf old_logs_$(date +%Y%m%d).tar.gz
  4. # 确认打包成功后,再删除原文件
  5. find /var/log -name "*.log" -mtime +30 -delete
复制代码
  1. -print0
复制代码
配合
  1. xargs -0
复制代码
是为了正确处理文件名中包含空格的情况,这个习惯值得养成。

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

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-3-24 04:19 , Processed in 0.132118 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表