tar 命令详解
更新时间:2026-08-29。本文是「一个命令一个文档」系列,属于归档压缩命令。备份、传文件、发源码包,
tar几乎离不开。
为什么写 tar?因为参数顺序的玄学坑了无数人:-f 后面必须紧跟文件名,写成 tar -czf file.tgz - 之类没问题,但 tar -czf a.tgz dir 里 f 后的 a.tgz 就是目标。还有压缩算法怎么选(gzip 快、xz 小、zstd 又快又小)——这直接影响备份时间和体积。
tar(tape archive,磁带归档)把多个文件/目录打包成一个文件(本身不压缩),再配合压缩算法(gzip/xz/zstd 等)压成 .tar.gz/.tar.xz 等。
一、最基本的三件事:打包、查看、解包
tar -cf archive.tar dir/ # -c 创建打包(未压缩)
tar -tf archive.tar # -t 列出内容(test/list)
tar -xf archive.tar # -x 解包到当前目录
tar -xvf archive.tar # -v 显示解包过程
-f指定归档文件名,它后面必须紧跟文件名,这是最多人踩的坑。把f放中间如tar -cvf没问题,但tar -cfv会把v当文件名。记死:f永远是最后一个字母、且后接文件名。
二、压缩算法怎么选(核心)
tar 本身不压缩,靠 -z/-j/-J/--zstd 调用外部压缩器:
| 参数 | 算法 | 典型扩展名 | 速度 | 压缩率 | 适用 |
|---|---|---|---|---|---|
-z | gzip | .tar.gz | 快 | 中 | 通用默认,兼容性最好 |
-j | bzip2 | .tar.bz2 | 慢 | 较高 | 少见,被 xz 取代 |
-J | xz | .tar.xz | 很慢 | 最高 | 追求最小体积(源码发布) |
--zstd | zstd | .tar.zst | 很快 | 高 | 现代首选,速度体积兼得 |
| 无 | 不压缩 | .tar | 最快 | 1.0 | 仅打包不压(传大文件用) |
经验:日常备份用
-z(gzip)图快和兼容;发源码包/省存储用-J(xz)图小;新项目直接--zstd,速度和压缩率都好,且主流发行版已带 zstd。解包时 tar 能自动识别压缩类型,所以tar -xf a.tar.xz不用显式写-J。
三、高频选项一张表
| 选项 | 作用 | 示例 |
|---|---|---|
-c | 创建归档 | tar -cf a.tar dir |
-x | 解包 | tar -xf a.tar |
-t | 查看内容列表 | tar -tf a.tar |
-v | 显示过程(verbose) | tar -cvf ... |
-f | 指定归档文件 | 必须后接文件名 |
-z/-j/-J/--zstd | 压缩算法 | tar -czf a.tgz dir |
-C | 解包到指定目录 | tar -xf a.tar -C /tmp |
-p | 保留权限(extract permissions) | tar -xpf a.tar(备份用) |
--exclude | 排除某些文件 | tar -czf a.tgz dir --exclude=*.tmp |
--strip-components=N | 解包时去掉前 N 层路径 | tar -xf a.tar --strip-components=1 |
-r | 向已有归档追加文件 | tar -rf a.tar newfile |
-u | 仅追加比归档内更新的 | tar -uf a.tar dir |
四、实战 demo
demo 1:打包并 gzip 压缩整个项目(排除垃圾)
tar -czf myproject.tgz myproject/ --exclude=node_modules --exclude=.git
# 发布源码包的标准写法:快、兼容、体积小demo 2:解包到指定目录(不污染当前)
tar -xzf myproject.tgz -C /tmp/extract/
# -C 指定解包目标,避免在当前目录散开demo 3:先看后解(确认包里有什么再动手)
tar -tzf unknown.tar.gz | head
# -t 列出内容,先看路径是否带绝对路径/会覆盖,再决定是否 -xdemo 4:解包时去掉顶层目录(--strip-components)
tar -xzf v1.2.0.tar.gz --strip-components=1
# 很多源码包顶层是 project-1.2.0/,加这选项直接解出内容、不要那层demo 5:保留权限的备份(系统配置)
tar -czpf etc-backup.tgz /etc
# -p 保留 owner/权限/时间戳,还原时一字不差
# 注意:还原系统文件需 rootdemo 6:压缩率/速度对比(选算法有依据)
# 同一目录分别用三种算法,看体积与时间
tar -czf a.tgz dir/ && ls -lh a.tgz
tar -cJf a.txz dir/ && ls -lh a.txz # 更慢更小
tar --zstd -cf a.tzst dir/ && ls -lh a.tzst # 快且小五、压缩算法对比的结论
实测常见代码目录:gzip 体积 100%、xz 约 70%、zstd 约 75%,但 xz 慢数倍、zstd 几乎和 gzip 同速。所以:
- 要最快且兼容 → gzip (
-z) - 要最小(不计时间)→ xz (
-J),适合归档冷备份 - 要均衡 → zstd (
--zstd),现代推荐
六、常见坑
-f后必须紧跟文件名,参数顺序错会出怪错。- 用绝对路径打包(如
tar -cf a.tar /etc)解包会覆盖/etc——用-C /配合相对路径或--strip-components。 --exclude的模式相对于打包时的路径写,容易写错导致没排除。- 解
.tar.xz忘了写-J但tar -xf通常能自动识别,新版本 tar 很智能。
七、进阶:增量备份与差异还原
超出"打包解包"后,tar 在备份里最实用的是增量归档——只打包上次之后变过的文件:
# 第一次做全量快照(记录增量基准)
tar -czf full.tgz -g snap.snar /data
# 之后每次只打包变化的(snap.snar 记录状态)
tar -czf inc1.tgz -g snap.snar /data
# 还原:先全量、再按序解各增量
tar -xzf full.tgz -C /restore
tar -xzf inc1.tgz -C /restore-g snapshot.file 让 tar 维护一份"哪些文件改了"的索引,第二次起自动只收增量。配合 cron 做"日增+周全",备份体积和时间都可控。注意增量文件本身要一并备份,丢了就无法续传。
八、边界与坑的延伸
- 绝对路径打包是雷:
tar -cf a.tar /etc解包会试图写回/etc。要么用相对路径tar -cf a.tar -C / etc,要么还原时--strip-components去掉开头的/。 - 大目录别边打包边压缩看进度?
-v在海量文件时刷屏很慢,可重定向到文件事后看,或干脆-t事后列清单。 -f必须紧跟文件名:tar -cz dir -f a.tgz会把dir当文件名——顺序错了 tar 报"无法 stat"。固定写成tar -czf a.tgz dir最稳。- 稀疏文件:虚拟机镜像、数据库大文件常是稀疏文件,
tar默认会填满空洞变巨大,加--sparse(或-S)只存有效数据。 - 并发解包慢:CPU 解压是单线程瓶颈,超大包可在多核机上分目录并行 tar,或换
pigz(tar -I pigz -cf)。
算法选型:日常传包用 gzip;冷归档求最小用 xz;新项目直接 zstd,几乎同速却更小。
相关命令
一句话总结
tar = 打包+压缩:-c建/-x解/-t看/-v过程/-f(后接文件名!);算法 -z(gzip 快兼容)/-J(xz 最小慢)/--zstd(均衡推荐),解包自动识别;-C 指定目标目录、--exclude 排除、--strip-components 去顶层;备份加 -p 保留权限。