find配合tar可一步查找并安全打包压缩日志文件,核心是用-print0与--null配合处理含空格等特殊字符的路径,支持按名称、类型、时间(如-mtime -7)、排除目录(-prune或! -path)及保留/精简路径结构。

直接用 find 配合 tar 可以一步完成查找并打包压缩所有日志文件,关键是把 find 的输出安全传递给 tar,避免路径含空格或特殊字符出错。
定位日志文件并交给 tar 打包
最稳妥的方式是用 -print0 和 --null 配合,确保文件名里有空格、换行或括号也不出错:
find /var/log -name "*.log" -type f -print0 | tar -czf logs.tar.gz --null -T -
说明:
- /var/log 是常见日志目录,可换成其他路径(如 /opt/app/logs)
- -name "*.log" 匹配 .log 后缀,也可扩展为 "*.log*" 或 "*.out" 等
- -type f 确保只选普通文件,跳过目录或符号链接
- -print0 | tar ... --null -T - 是核心:find 用 \0 分隔文件名,tar 用 --null 识别,-T - 表示从标准输入读取文件列表
按时间范围筛选再打包
如果只想打包最近 7 天的日志,加 -mtime -7:
find /var/log -name "*.log" -type f -mtime -7 -print0 | tar -czf recent-logs.tar.gz --null -T -
注意:
- -mtime -7 表示“修改时间在 7 天内”(即不到 7 天)
- 若需按访问时间,可用 -atime;按状态变更时间,用 -ctime
- 时间单位是“24 小时”,不是精确到秒,如需更精细控制,可用 -newermt "2024-05-01"
排除特定目录或文件
打包时跳过某些子目录(比如不打包 journal 日志或容器日志):
- 用 -path + -prune 排除整个目录:
find /var/log -path "/var/log/journal" -prune -o -name "*.log" -type f -print0 | tar -czf logs.tar.gz --null -T -
- 排除多个路径,可叠加 -o -path ... -prune,或改用 ! -path:
find /var/log \( ! -path "/var/log/journal/*" ! -path "/var/log/containers/*" \) -name "*.log" -type f -print0 | tar -czf logs.tar.gz --null -T -
打包后保留原始结构(可选)
默认 tar 会保留相对路径。如果希望解压时还原完整路径(如 /var/log/syslog),直接执行即可;若只想打包文件名(不带目录),加 -C 切换到目标目录再操作:
cd /var/log && find . -name "*.log" -type f -print0 | tar -czf /tmp/logs.tar.gz --null -T -
这样打包进 tar 的路径就是 ./syslog,解压时不会创建 /var/log 目录层级。
不复杂但容易忽略细节,关键是 print0 + --null 组合,能应对绝大多数生产环境的文件名问题。


















