tar命令本身只打包不压缩,压缩需gzip(-z)、bzip2(-j)或xz(-J)协同;常用操作包括-cf打包、-czf压缩打包、-tzf查看、-xzf解压,配合-C指定路径、--exclude排除目录。

tar 命令在绝大多数 Linux 发行版中已预装,无需额外安装。如果你执行 tar --version 能看到输出(比如 tar (GNU tar) 1.34),说明它就在系统里,直接可用。
tar -cvf 打包目录(不压缩,只归档)
这是最基础、也最容易被忽略的一步:打包 ≠ 压缩。tar 本身只负责把文件“捆”成一个文件(保留权限、时间戳、软链接等元数据),不减小体积。
-
-c:创建新归档 -
-v:显示过程(可选,调试时很有用) -
-f:指定输出文件名(必须是最后一个选项,或紧跟在-f后面)
例如,把 /etc/nginx 目录打包为 nginx-conf.tar:
tar -cvf nginx-conf.tar /etc/nginx/
注意:
- 路径末尾加不加
/不影响内容,但会影响解压后目录名(/etc/nginxvs/etc/nginx/) - 如果目标路径不存在,
tar会报错并中止,不会静默跳过
tar -czvf 和 tar -cJvf:选对压缩算法很关键
压缩是独立于打包的第二步,由 -z(gzip)、-j(bzip2)、-J(xz)触发。它们互斥,不能混用(比如 -czJf 会报 invalid option -- 'J')。
-
tar -czvf backup.tar.gz /var/log
→ 快、兼容性好,适合日常传输、备份;老系统、容器镜像、CI 环境基本都认 -
tar -cJvf archive.tar.xz /home/user/large-data
→ 压缩率高(通常比.tar.gz小 20%~30%),但 CPU 消耗大、解压慢;部分精简系统(如某些 Alpine 镜像)默认没装xz,需先apk add xz
验证是否支持某算法:
tar -cJvf
--exclude 排除临时文件,但匹配逻辑容易踩坑
--exclude 匹配的是归档内路径的相对形式,不是你执行命令时的当前路径。
比如你在 /home/alice/project 下运行:
tar -czf proj.tar.gz --exclude=node_modules --exclude=.git .
那么 tar 实际检查的是打包后路径是否以 node_modules/ 或 .git/ 开头(注意结尾斜杠隐含目录匹配)。它不支持通配符如 *.log;要过滤扩展名,得用 --exclude-from= 配合 shell glob 处理,或改用 find 预筛选。
常见错误:
- 写成
--exclude=/node_modules(开头/会被忽略,匹配失效) - 在绝对路径打包时误以为排除规则也按绝对路径走(实际仍按归档内相对路径判)
- 多个
--exclude之间不能用空格连写,必须分开:
✅--exclude=a --exclude=b
❌--exclude=a b
解压到指定位置或只抽个别文件,路径必须完全一致
tar -xzf archive.tar.gz -C /opt/app 中的 -C 是解压前切换工作目录,之后所有路径都相对于该目录解析。
更关键的是「只解压某个子路径」:
tar -tzf archive.tar.gz | grep -E '^(etc/|usr/bin/)' # 先确认真实路径 tar -xzf archive.tar.gz etc/hosts usr/bin/python3
这里 etc/hosts 必须和 tar -t 输出的字符串逐字符一致:
- 如果列表里是
/etc/hosts(带根),你就得写/etc/hosts - 如果列表里是
etc/hosts(无根),写成/etc/hosts就抽不出
这点在从别人给的包里取配置时特别容易卡住——路径偏差一个字符,tar 就静默跳过,不报错也不提示。











