tar 压缩解压速查表 - tar 打包压缩命令大全

备份目录、分发代码、迁移服务器前把文件打成单个包,tar 绕不开;难点不是命令,而是压缩格式的选择和几个会造成不可逆后果的参数。压缩格式对比一组说明取舍:-z(gzip,速度与压缩率均衡)、-j(bzip2,同体积更小但更慢)、-J(xz,压缩率最高且支持多线程,代价是耗时)、--zstd(兼顾速度与压缩率,新项目的合理默认)。备份场景还有两条必须记住:tar 默认记录权限与属主,解压时不带 --no-same-owner 或以 root 运行会意外改动属主;--exclude、--exclude-from 决定哪些目录不进包。解压最危险的是路径穿越,所以先用 tar -tf 列一遍再动手。还有那个每次都忘的位置:-C 必须放在归档文件名之后,--strip-components 用来去掉前 N 层目录。

系统与运维·共 44 条命令·最后更新 2026-07-21
targzipbzip2xz压缩

典型使用场景

面向备份目录、迁移服务器、发布代码包的开发者。tar 的难点不在记忆命令,而在三件事:压缩格式怎么选(gzip/zstd/xz 的速度与压缩率取舍)、源目录末尾斜杠决定同步的是内容还是目录本身、以及覆盖解压的不可逆性。本表覆盖打包、解压、查看、格式对比与高级用法五组,示例里的 --exclude 与 --strip-components 是两个最容易踩坑也最容易省事的参数。

打包与压缩 7

tar -cvf archive.tar dir/
打包为 .tar(不压缩),-c 创建 -v 显示 -f 文件名
tar -czvf archive.tar.gz dir/
打包并用 gzip 压缩(.tar.gz / .tgz),最常用
tar -cjvf archive.tar.bz2 dir/
打包并用 bzip2 压缩,比 gzip 压缩率高但更慢
tar -cJvf archive.tar.xz dir/
打包并用 xz 压缩,压缩率最高但最慢
tar --zstd -cvf archive.tar.zst dir/
用 zstd 压缩,速度远快于 gzip,新系统推荐
tar -czvf archive.tar.gz --exclude="*.log" dir/
打包时排除 .log 文件
tar -czvf archive.tar.gz --exclude="node_modules" --exclude=".git" project/
排除多个目录

解压与提取 8

tar -xvf archive.tar
解包 .tar,-x 提取
tar -xzvf archive.tar.gz
解压 .tar.gz / .tgz
tar -xjvf archive.tar.bz2
解压 .tar.bz2 / .tbz2
tar -xJvf archive.tar.xz
解压 .tar.xz / .txz
tar --zstd -xvf archive.tar.zst
解压 .tar.zst
tar -xzvf archive.tar.gz -C /opt/
解压到指定目录(-C)
tar -xzvf archive.tar.gz file.txt
只解压包内指定文件
tar -xzvf archive.tar.gz --strip-components=1
解压时去掉第一层目录结构

查看与测试 5

tar -tf archive.tar.gz
列出压缩包内容(不解压),-t 列表
tar -tzvf archive.tar.gz
详细列出含文件大小和权限
tar -tf archive.tar.gz | grep "config"
查找压缩包中的指定文件
gzip -t archive.tar.gz
测试 gzip 完整性,无输出=正常
tar -dvf archive.tar
对比压缩包内文件与磁盘文件差异

压缩格式对比 6

-z (gzip)
速度最快,兼容性最好,.tar.gz / .tgz
-j (bzip2)
压缩率高于 gzip,速度较慢,.tar.bz2
-J (xz)
压缩率最高,速度最慢,.tar.xz
--zstd (zstd)
速度最快且压缩率好,新系统推荐,.tar.zst
-a
根据文件后缀自动选择压缩格式
--use-compress-program=pigz
用 pigz 多线程 gzip 加速压缩

其他压缩工具 8

zip -r archive.zip dir/
zip 压缩目录
unzip archive.zip -d /opt/
解压 zip 到指定目录
unzip -l archive.zip
查看 zip 内容(不解压)
gzip file.txt
压缩单个文件为 file.txt.gz(原文件消失)
gzip -k file.txt
压缩并保留原文件(-k keep)
gunzip file.txt.gz
解压 .gz 单文件
zcat file.txt.gz
不解压直接查看 .gz 文件内容
7z x archive.7z
解压 7z 格式,需安装 p7zip

高级用法 6

tar -rvf archive.tar newfile.txt
向已有 .tar 包追加文件(不支持压缩包)
tar -uvf archive.tar dir/
仅更新比包内新的文件
tar -czf - dir/ | ssh host "tar -xzf - -C /dest"
通过 SSH 管道传输并解压
tar -czf - dir/ | split -b 100M - archive.tar.gz.
分卷压缩为 100MB 的文件
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/app
解压到指定目录并去掉顶层目录
tar -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
-kgzip 压缩时保留原文件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. 1先列内容确认结构再决定怎么解

    tar -tzvf a.tar.gz | head -20

    查看条目、大小与权限;对来路不明的包尤其要先看这一步。

  2. 2解压到指定目录并剥掉顶层

    mkdir -p /opt/app && tar -xzf a.tar.gz --strip-components=1 -C /opt/app

    发布包部署的标准写法,避免双层嵌套。

  3. 3校验压缩包是否完整

    gzip -t a.tar.gz && echo OK

    无输出即正常;配合 && echo 给出明确结论便于脚本判断。

  4. 4排除无关目录后再打包

    tar -czvf app.tar.gz --exclude="*.log" --exclude="node_modules/" --exclude=".git" app/

    体积通常能降一个数量级,也避免把密钥打进包里。

  5. 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 OK

gzip -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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们