Linux中用tar排除指定目录打包的核心是--exclude参数,正确写法需注意:路径不加末尾斜杠、--exclude置于-f前、推荐用相对路径;支持多参数排除、通配符匹配(如*/node_modules)、或通过--exclude-from读取外部列表文件。

Linux 中用 tar 排除指定目录打包,核心靠 --exclude 参数,写法简单但路径细节容易出错。关键不是“能不能排除”,而是“怎么写才真正生效”。
直接用 --exclude 排除单个或多个目录
这是最常用也最直观的方式。注意两点:一是 --exclude 必须写在 -f 之前;二是路径写法要和打包目标保持一致(推荐都用相对路径)。
- 排除当前目录下的
logs和tmp目录:tar -zcvf backup.tar.gz --exclude=logs --exclude=tmp ./project/ - 排除子目录时,可写完整相对路径(更稳妥):
tar -zcvf backup.tar.gz --exclude=./project/logs --exclude=./project/tmp ./project/ - 不要在排除路径末尾加
/,比如--exclude=logs/会被忽略,正确写法是--exclude=logs
用通配符批量排除同类目录
适合排除多层结构中名称统一的目录,比如所有 node_modules 或 cache。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 排除任意层级下的
node_modules:tar -zcvf app.tar.gz --exclude='*/node_modules' ./src/ - 排除所有隐藏目录(以点开头):
tar -zcvf clean.tar.gz --exclude='.*' ./project/ - 排除所有
.log文件和temp目录:tar -zcvf data.tar.gz --exclude='*.log' --exclude=temp ./data/
用排除文件列表管理复杂规则
当要排除的项目较多(比如开发项目中常见的 .git、build/、dist/、.DS_Store 等),单独列 --exclude 会让命令过长且难维护。这时推荐用文本文件统一管理:
- 先创建排除列表文件,例如
exclude-list.txt:cat > exclude-list.txt <<EOF<br>.git<br>node_modules<br>build/<br>dist/<br>*.log<br>*.tmp<br>EOF
- 再用
--exclude-from引入:tar -zcvf project.tar.gz --exclude-from=exclude-list.txt ./project/ - 也可简写为
-X:tar -zcvf project.tar.gz -X exclude-list.txt ./project/
常见坑和验证方法
排除失败往往不是参数错了,而是路径理解偏差。打包前建议快速验证:
- 先用
-t查看 tar 包内容(不实际生成):tar -tzvf backup.tar.gz | head -20,确认被排除项没出现 - 如果用了绝对路径打包(如
/var/www/site),排除项也建议用绝对路径,或统一转成相对路径更可靠 -
--exclude匹配的是归档内路径名,不是磁盘上的绝对路径——所以进到目标目录下执行(cd /path/to/dir && tar ... .)通常更清晰

















