tar 压缩解压速查表 - tar 打包压缩命令大全
备份目录、分发代码、迁移服务器前把文件打成单个包,tar 绕不开;难点不是命令,而是压缩格式的选择和几个会造成不可逆后果的参数。压缩格式对比一组说明取舍:-z(gzip,速度与压缩率均衡)、-j(bzip2,同体积更小但更慢)、-J(xz,压缩率最高且支持多线程,代价是耗时)、--zstd(兼顾速度与压缩率,新项目的合理默认)。备份场景还有两条必须记住:tar 默认记录权限与属主,解压时不带 --no-same-owner 或以 root 运行会意外改动属主;--exclude、--exclude-from 决定哪些目录不进包。解压最危险的是路径穿越,所以先用 tar -tf 列一遍再动手。还有那个每次都忘的位置:-C 必须放在归档文件名之后,--strip-components 用来去掉前 N 层目录。
典型使用场景
面向备份目录、迁移服务器、发布代码包的开发者。tar 的难点不在记忆命令,而在三件事:压缩格式怎么选(gzip/zstd/xz 的速度与压缩率取舍)、源目录末尾斜杠决定同步的是内容还是目录本身、以及覆盖解压的不可逆性。本表覆盖打包、解压、查看、格式对比与高级用法五组,示例里的 --exclude 与 --strip-components 是两个最容易踩坑也最容易省事的参数。
打包与压缩 7
tar -cvf archive.tar dir/tar -czvf archive.tar.gz dir/tar -cjvf archive.tar.bz2 dir/tar -cJvf archive.tar.xz dir/tar --zstd -cvf archive.tar.zst dir/tar -czvf archive.tar.gz --exclude="*.log" dir/tar -czvf archive.tar.gz --exclude="node_modules" --exclude=".git" project/解压与提取 8
tar -xvf archive.tartar -xzvf archive.tar.gztar -xjvf archive.tar.bz2tar -xJvf archive.tar.xztar --zstd -xvf archive.tar.zsttar -xzvf archive.tar.gz -C /opt/tar -xzvf archive.tar.gz file.txttar -xzvf archive.tar.gz --strip-components=1查看与测试 5
tar -tf archive.tar.gztar -tzvf archive.tar.gztar -tf archive.tar.gz | grep "config"gzip -t archive.tar.gztar -dvf archive.tar压缩格式对比 6
-z (gzip)-j (bzip2)-J (xz)--zstd (zstd)-a--use-compress-program=pigz其他压缩工具 8
zip -r archive.zip dir/unzip archive.zip -d /opt/unzip -l archive.zipgzip file.txtgzip -k file.txtgunzip file.txt.gzzcat file.txt.gz7z x archive.7z高级用法 6
tar -rvf archive.tar newfile.txttar -uvf archive.tar dir/tar -czf - dir/ | ssh host "tar -xzf - -C /dest"tar -czf - dir/ | split -b 100M - archive.tar.gz.cat archive.tar.gz.* | tar -xzvf -tar -g snapshot.snar -czf backup.tar.gz dir/常见示例 4
tar -czvf backup-$(date +%F).tar.gz /home/user/tar -czvf app.tar.gz --exclude="*.log" --exclude="tmp/" app/tar -xzvf package.tar.gz --strip-components=1 -C /opt/apptar -czf - /data | pigz > backup.tar.gz参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-z (gzip) | 速度最快、兼容性最好 | tar -czvf a.tar.gz dir/ |
--zstd | 速度接近 gzip、压缩率更好,新系统推荐 | tar --zstd -cvf a.tar.zst dir/ |
-J (xz) | 压缩率最高但最慢 | tar -cJvf a.tar.xz dir/ |
-c / -x / -t | 创建 / 解压 / 列出不解压 | tar -tf a.tar.gz |
-v | 显示处理的文件名 | tar -czvf a.tar.gz dir/ |
--exclude | 打包时排除路径或模式 | --exclude="*.log" --exclude="node_modules/" |
--strip-components=N | 解压时去掉前 N 层目录 | tar -xzf a.tar.gz --strip-components=1 -C /opt |
-C dir | 切换到指定目录操作 | tar -xzf a.tar.gz -C /opt/app |
-k | gzip 压缩时保留原文件 | gzip -k file.txt |
pigz | 多线程压缩大目录 | tar -czf - /data | pigz > b.tar.gz |
split -b 100M | 分卷便于传输 | tar -czf - dir/ | split -b 100M - a.tar.gz. |
gzip -t | 测试压缩包完整性,无输出即正常 | gzip -t a.tar.gz |
易错点与避坑指南
现象解压后目录多了一层,出现 /opt/app/app/ 这样的结构。
原因打包时源目录写法或解压时未剥离顶层目录。
处置用 --strip-components=1 解压,或打包时用 -C dir . 让内容不带顶层目录。
现象打包体积巨大,node_modules 与 .git 都在里面。
原因未使用 --exclude。
处置tar -czvf a.tar.gz --exclude="node_modules/" --exclude=".git" --exclude="*.log" app/
现象解压到指定目录失败,提示权限或路径不存在。
原因目标目录未创建。
处置先 mkdir -p /opt/app 再配合 -C 指定。
现象对 .tar.gz 使用 tar -r 追加文件报错。
原因追加只支持未压缩的 .tar 归档。
处置需要追加内容时重新打包,或先用 gzip -d 解压再追加最后重压。
现象解压时报路径穿越相关警告或文件落到意外位置。
原因归档内含 ../ 或绝对路径条目。
处置先用 tar -tf 查看条目清单,对来路不明的包先解到隔离目录。
现象split 分卷后合并解压报损坏。
原因漏合并某个分卷,或合并顺序不对。
处置确认所有 .part 文件齐全后 cat a.tar.gz.* | tar -xzf - 合并解压。
排障路径
1先列内容确认结构再决定怎么解
tar -tzvf a.tar.gz | head -20查看条目、大小与权限;对来路不明的包尤其要先看这一步。
2解压到指定目录并剥掉顶层
mkdir -p /opt/app && tar -xzf a.tar.gz --strip-components=1 -C /opt/app发布包部署的标准写法,避免双层嵌套。
3校验压缩包是否完整
gzip -t a.tar.gz && echo OK无输出即正常;配合 && echo 给出明确结论便于脚本判断。
4排除无关目录后再打包
tar -czvf app.tar.gz --exclude="*.log" --exclude="node_modules/" --exclude=".git" app/体积通常能降一个数量级,也避免把密钥打进包里。
5大目录用 pigz 多线程加速
tar -czf - /data | pigz > backup.tar.gz多核并行压缩,通常比单线程 gzip 快数倍。
命令示例
打包项目并排除日志与依赖目录
tar -czvf app.tar.gz --exclude="*.log" --exclude="node_modules/" --exclude=".git" app/--exclude 在打包时过滤,比先打包再删更省时间和磁盘。多阶段构建的项目务必排除 node_modules,它通常是体积大头且可由 npm ci 重建。
输出
app/package.json app/src/ app/src/main.ts app/dist/ app/dist/index.js
解压到指定目录并去掉顶层文件夹
tar -xzvf package.tar.gz --strip-components=1 -C /opt/app--strip-components=1 去掉包里的第一层目录,-C 指定落点。发布包部署时最常用,否则会得到 /opt/app/package/ 这样的双层结构。
输出
package.json src/ src/main.ts dist/index.js
不完整解压先看看里面有什么
tar -tzvf package.tar.gz | head -20-t 只列表不解压,-v 显示权限与时间。确认路径结构与权限位符合预期后再解,尤其对来路不明的压缩包。
输出
-rw-r--r-- root/root 1024 2026-09-28 10:11 package.json drwxr-xr-x root/root 4096 2026-09-28 10:11 src/ -rwxr-xr-x root/root 24576 2026-09-28 10:12 dist/index.js
打包时保留完整时间戳便于校验
tar -czvf backup-$(date +%F).tar.gz /home/user/
gzip -t backup-$(date +%F).tar.gz && echo OKgzip -t 测完整性,无输出即正常;这里用 && echo OK 把它变成一条明确的结论。用日期命名避免多次备份互相覆盖。
输出
OK
常见坑与注意事项
- tar -x 覆盖同名文件不提示,路径带 .. 或绝对路径时可能写到目标目录之外,解压来路不明的包前先用 -t 查看内容。
- tar -c 打包时不加 --exclude 会把 node_modules、.git 等一并打进去,体积可能翻数倍且泄露密钥。
- tar -f 后面必须紧跟文件名且与压缩标志配合,标志写错(如用 -j 对应 bzip2 却传 .gz)会静默产生错误格式。
- 追加文件(tar -r)只支持未压缩的 .tar,对 .tar.gz 使用会报错或损坏包。
- split 分卷后必须用 cat archive.* 合并再解压,漏掉任一分卷会得到截断的包。
提示
- 记忆口诀:c=create(打包),x=extract(解压),t=list(查看),z=gzip,j=bzip2,J=xz。
- 解压前先用 tar -tf 查看内容,确认没有 ../ 路径穿越(zip slip 安全风险)。
- 大文件压缩用 zstd --long=31 利用长距离匹配,比 gzip 快 5-10 倍且压缩率更好。
- tar 追加文件只支持未压缩的 .tar,对 .tar.gz 需先解压再重新打包。
- pigz 是 gzip 的多线程版本,压缩大文件时用 tar -cf - dir | pigz > out.tar.gz 大幅加速。
- -C 指定解压目录要在文件名之后,--strip-components 去掉前 N 层目录避免解压出嵌套。
- tar -tvf 包.tar.gz 解压前先看权限和属主列,能提前发现包里带着奇怪 uid/gid 的文件,避免解压后整个目录属主被改。
- tar --exclude-vcs --exclude='*.log' 创建包时排除版本控制目录和日志,比事后删文件省一次全量重传。
- gzip -l 包.tar.gz 可以只读元数据查看压缩前后大小与压缩率,判断某个包为什么解压慢,多个 -l 支持一次查多个文件。
常见问题
gzip、bzip2、xz、zstd 该选哪个?
看两个指标:速度与压缩率。gzip 最快、兼容性最好,适合日常打包;zstd 速度接近 gzip 但压缩率明显更好,新系统优先选它;xz 压缩率最高但最慢,适合归档不常打开的文件;bzip2 现在基本可以不用了。命令上分别是 -z、--zstd、-J。
tar 打包时怎么排除 node_modules 和日志?
用 --exclude,比如 tar -czvf app.tar.gz --exclude="*.log" --exclude="node_modules/" --exclude="tmp/" app/。更好的做法是配合 .dockerignore 或 .gitignore 思路先清理再打包,这类文件往往体积占大头却可随时重新生成。更推荐用 -C 指定目录,这样包里不会多出一层目录名。
解压时想去掉最外层目录该怎么做?
加 --strip-components=1:tar -xzvf package.tar.gz --strip-components=1 -C /opt/app。这样包里的 app/package.json 会直接落到 /opt/app/ 而不是 /opt/app/app/package.json。这是发布包、部署脚本里最常用的一招,通常再配合 -C 指定安装目录。
怎么在不完整解压的情况下查看压缩包内容?
用 -t 列出而不解压:tar -tzvf archive.tar.gz 会显示文件名、大小和权限但不解压。要在包里找特定文件可以接管道 tar -tf archive.tar.gz | grep "config"。另外 gzip -t archive.tar.gz 能快速测试压缩包完整性,无输出即正常。
大目录打包太慢,怎么加速?
压缩本身是瓶颈,可以用 pigz 多线程压缩:tar -czf - /data | pigz > backup.tar.gz,pigz 利用多核并行,速度通常是单线程 gzip 的数倍。若单文件过大需要分卷,用 tar -czf - dir/ | split -b 100M - archive.tar.gz.,之后用 cat archive.tar.gz.* | tar -xzvf - 合并回来。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。