用 tar 备份站点目录,加了 --exclude=logs 想跳过日志,解包后发现 logs 目录原封不动在里面,备份包比预期大了 12G。

一开始怀疑是「用了 -C 切换目录,排除模式要相对切换后的路径写」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。--exclude 的匹配是按路径模式,logs 没带通配符时匹配不到 ./logs。少数情况下是排除参数写在了目标文件之后,被 tar 当成待打包的路径。

还有一种情况,同时用了 -T 文件列表,列表里的路径不受 --exclude 约束。

试运行看实际会打包哪些文件

tar --exclude='*/logs/*' -cvf /dev/null -C /www/wwwroot site | grep logs | head

然后把排除模式放到参数最前面并加通配

tar --exclude='site/logs' --exclude='*.log' -czf /backup/site.tgz -C /www/wwwroot site

接着确认包内不再包含日志目录

tar -tzf /backup/site.tgz | grep -c 'logs/'

等前面都确认过,再核对包体积是否符合预期

du -sh /backup/site.tgz && du -sh /www/wwwroot/site

别只看报错消失,验证要多做一步。tar -tzf 里 logs 相关条目数量为零,备份包体积降到与代码和静态资源相符的大小,解包后目录结构完整。

补一句。--exclude 一定要写在待打包路径之前,顺序错了参数会被忽略;带 -C 时模式按相对路径匹配,最好先用 -cvf /dev/null 空跑验证。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189