做什么

把多个文件打包成一个文件(archive)——通常配合压缩。

必记的两个命令

# 打包 + gzip 压缩
tar -czvf archive.tar.gz folder/
#     ↓
#     c=create z=gzip v=verbose f=file

# 解压
tar -xzvf archive.tar.gz
#     ↑
#     x=extract

参数速记

含义
c create(打包)
x extract(解压)
t list(仅查看不解压)
z gzip
j bzip2
J xz
a 按后缀自动选压缩方式
v verbose
f file(指定文件名,必须

实战

# 查看(不解压)
tar -tzvf archive.tar.gz

# 解压到指定目录
tar -xzvf archive.tar.gz -C /tmp/

# 只解压某文件
tar -xzvf archive.tar.gz folder/file.txt

# 排除某目录
tar --exclude='*/cache/*' -czvf backup.tar.gz /home/wadely

# xz 极致压缩(慢但小)
tar -cJvf logs.tar.xz /var/log/

# 不落地直接传到远程
tar czf - folder/ | ssh user@remote 'tar xzf - -C /backup/'

# 增量备份(基于 snapshot)
tar -czf full.tar.gz -g snapshot.snar folder/
tar -czf incr1.tar.gz -g snapshot.snar folder/    # 第二次 = 增量

常见后缀

.tar              只打包,不压缩
.tar.gz / .tgz    + gzip
.tar.bz2 / .tbz   + bzip2
.tar.xz           + xz(最小)
.tar.zst          + zstd(最快)

压缩比对比(粗略)

工具 速度 压缩比
gzip
bzip2 较高
xz 最高
zstd 极快 高 ★

新项目可以用 zstd:

tar --use-compress-program=zstd -cf archive.tar.zst folder/

验证压缩包

gzip -t archive.tar.gz && echo OK            # 检查 gzip 完整
tar -tzf archive.tar.gz > /dev/null && echo OK

  • tar 不带 f 会跑去用 tape 设备(老古董设计)—— 永远带 f
  • 在 / 下面创建 tar 时(如 tar -czf /tar root/)小心别把 archive 自己也打包进去
  • 绝对路径开头的 / 会被 tar 默认去掉——解压时不会还原到 /,是相对当前目录