登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux tar 打包时怎么排除日志和缓存目录

来源:17golang原创

时间:2026-09-05 23:29:23 221浏览 收藏

Linux 项目打包时,日志和缓存通常会占掉大量空间,却不是部署或备份必须保留的内容。最直接的做法是在 GNU tar 后面重复写 --exclude,并把通配模式放进单引号;排除规则较多时,再单独维护一个文件交给 -X。例如项目目录是 /srv/shop-api,可以这样打包:

tar 的排除匹配是按归档成员名工作的。排除 shop-api/var/log/ 这样的目录前缀后,其下面的日志文件也不会进入归档;命令中的 * 要交给 tar,而不是让当前 shell 先展开。
要点速览
  • 少量目录直接重复使用 --exclude='相对路径'
  • 规则多或要复用时,用 --exclude-from=exclude.txt,一行写一个模式。
  • 打包后用 tar -tf 查看成员,确认日志、缓存没有混入。

先确定 tar 看到的路径边界

排除规则最容易出错的地方不是参数拼写,而是路径基准。若在 /srv 下执行并把 shop-api 作为归档对象,成员名通常以 shop-api/ 开头;若先切换到项目目录再打包,成员名可能从 var/public/ 开始。两种写法都可以,但排除模式必须和归档清单中的名字一致。

直接通过 tar 命令的 --exclude 参数,指定要跳过的日志、缓存文件夹路径,就能在打包的时候自动排除对应内容,不需要额外先删除原文件。
tar 归档根目录、保留文件与日志缓存排除边界的静态关系图
图1:先区分归档根目录、需要保留的源码配置和需要排除的日志缓存边界。

推荐先列出目录,再决定规则:

cd /srv
find shop-api -maxdepth 3 -type d \( -name log -o -name logs -o -name cache -o -name caches \) -print

这一步只是确认路径,不会改变文件。不要把生成的归档放在待打包目录内部,否则下一次打包可能把上一次的 .tar.gz 也收入其中。

少量目录直接使用 --exclude

假设要排除项目下的 var/logvar/cache 和所有测试缓存目录,可以写成:

cd /srv
tar -czf /backup/shop-api-$(date +%F).tar.gz \
  --exclude='shop-api/var/log' \
  --exclude='shop-api/var/cache' \
  --exclude='shop-api/**/__pycache__' \
  shop-api

--exclude 可以重复使用。这里的单引号很重要:如果写成未加引号的 --exclude=shop-api/**/__pycache__,shell 可能先尝试展开星号,tar 收到的就不再是原本的模式。目录名中是否带末尾斜杠不必反复试错,关键是模式要覆盖归档成员的前缀,并在最终清单中确认。

规则较多时用 -X 维护排除文件

当多个项目共用一套排除策略,建议创建一个不放进项目目录的清单:

cat > /srv/backup-exclude.txt 

-X--exclude-from 的短选项形式,文件按一行一个模式读取,适合放进备份脚本或版本化的运维配置。注释和空行要按实际 tar 版本的规则处理;不要把这个排除文件放到 shop-api 中并误以为它会自动生效,必须在命令中明确传给 -X

tar 命令、排除规则文件、归档成员之间的静态关系图
图2:用排除规则文件集中管理目录模式,再把规则作用到归档成员集合。

用归档清单做最后核对

创建完成后,不需要解压就能检查成员:

tar -tzf /backup/shop-api-clean.tar.gz > /tmp/shop-api-members.txt
grep -E '(^|/)(var/log|var/cache|__pycache__|\.pytest_cache)(/|$)' \
  /tmp/shop-api-members.txt

没有输出通常表示这些目录没有进入归档;如果仍有匹配,先看清单中的实际前缀,再调整排除模式。常见问题是把 var/log 写成了 logs,或者从项目父目录打包时漏了 shop-api/ 这一层。

场景建议写法检查重点
一两个固定目录--exclude='shop-api/var/log'归档根目录是否一致
多条可复用规则--exclude-from=/srv/backup-exclude.txt一行一个模式,文件路径可读
不确定是否排除成功tar -tzf archive.tar.gz按实际成员名复查

几个容易踩中的边界

第一,--exclude 使用 shell 风格通配,不是正则表达式;第二,显式写在命令行中的文件,如果它的路径组件命中了排除规则,也可能被排除;第三,排除日志目录不等于排除审计所需的关键配置,建议把轮转后的摘要、配置和数据库备份分别判断。最后,先用一个测试归档验证模式,再把同一组参数放进定时任务,后续只需持续检查 tar -tf 的清单。

相关问题

为什么 --exclude='*.log' 没有按预期工作?

先确认归档成员是否确实以 .log 结尾,并确保星号被引号保护;如果日志集中在固定目录,写完整相对前缀通常比全局通配更容易控制范围。

-X 文件能不能写绝对路径?

排除模式应按 tar 处理的成员名来写,而不是凭源文件系统的绝对路径猜测。先运行 tar -tf 观察成员前缀,再把对应模式放入排除文件。

参考:GNU tar 手册的文件排除说明

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>