find与tar配合是Linux中查找并压缩文件最可靠的方式,因find实时校验文件存在性,避免locate因数据库延迟导致漏包或误包,结合-exec或xargs可精准打包指定文件,并支持路径过滤、空格处理及压缩算法选择。

find 和 tar 配合使用,是 Linux 中查找并压缩文件最可靠、最可控的方式。用 locate + tar 看似快,但容易漏掉刚创建的文件或误打包已删除路径——它不实时,也不校验文件存在性。
用 find 查找再压缩:一步到位不丢文件
核心逻辑是:先用 find 找出目标文件,再通过 -exec 或 xargs 交给 tar 打包压缩。这种方式确保只处理当前真实存在的文件。
-
find /var/log -name "*.log" -mtime -7 -exec tar -rf logs-weekly.tar {} \;:把最近 7 天的 log 文件追加进logs-weekly.tar -
find /home -name "*.conf" -type f -print0 | xargs -0 tar -czf configs.tgz:用-print0和-0处理含空格或特殊字符的路径,避免中断 - 必须加
-type f,否则可能把目录本身也塞进包里(tar会递归打包目录,但你本意只是收集匹配的单个配置文件) - 如果要排除某些路径(比如
/proc或/sys),加-prune -o组合,例如:find / -path "/proc" -prune -o -path "/sys" -prune -o -name "core" -print
tar -zcvf vs tar -jcvf vs tar -Jcvf:压缩算法选哪个?
不同后缀对应不同压缩器,影响体积、速度和兼容性:
-
tar -zcvf archive.tar.gz ...:用gzip,通用性最好,几乎所有系统默认支持,压缩比中等,速度快 -
tar -jcvf archive.tar.bz2 ...:用bzip2,压缩比更高(尤其对文本),但 CPU 消耗大、速度慢,部分精简镜像可能没装bzip2 -
tar -Jcvf archive.tar.xz ...:用xz,压缩比最高,适合长期归档,但内存占用高、压缩极慢;解压时也需xz工具 - 别混用:比如
tar -zcvf archive.tar.xz是无效组合——后缀名应与压缩参数一致,否则解压会失败
常见错误:为什么 tar 报 “Cannot stat” 或打空包?
这通常不是 tar 的问题,而是 find 输出了不存在的路径,或权限不足导致跳过。
-
find默认不检查文件是否可读,遇到权限拒绝(如/root/.ssh)会报错并跳过,但继续执行;加2>/dev/null可屏蔽这些提示,但别因此忽略真实问题 - 如果
find结果为空,tar -cf archive.tar $(find ...)会变成tar -cf archive.tar,导致 tar 报错tar: Cowardly refusing to create an empty archive - 安全做法:先测试查找结果,例如
find /tmp -name "temp_*.txt" | head -n 3,确认有输出再执行压缩 - 绝对路径打包后解压会还原到原位置(如
/etc/hosts),想避免,cd 进目标目录再相对查找,或加-C /tmp参数指定工作目录
不要用 locate 直接喂给 tar
locate 返回的是数据库记录,不是实时文件列表。它可能包含已被删除的路径,也可能遗漏刚创建的文件——哪怕你刚运行过 updatedb,数据库更新也有延迟,且不校验权限。
- 典型陷阱:
locate *.log | xargs tar -czf logs.tgz—— 如果某条路径已删,tar会报tar: /var/log/app.log: Cannot stat: No such file or directory,但仍继续打包其余文件,你却不知道缺了什么 - 若真要用
locate加速,至少加-e选项:locate -e "*.log",它会过滤掉当前不存在的条目,但依然无法解决“刚创建未入库”的问题 - 生产环境脚本里,宁可多花几秒等
find,也不要为省那点时间引入不确定性


















