余白

tar 命令详解

tar(Tape Archive)最初是用于磁带备份的工具,现在广泛用于文件打包与压缩。 tar 本身只负责"打包"(将多个文件合并成一个),压缩功能由其他工具(gzip / bzip2 / xz / zstd)配合完成。


一、tar 命令的三件事

动作含义常用参数
打包把多个文件/目录合并成一个 .tar-c (create)
查看看 .tar 里有啥,但不实际解压-t (list)
解包把 .tar 里的文件释放出来-x (extract)

必记 3 个字母:c 创建 / t 查看 / x 解压。其余 90% 的选项都是修饰。


二、核心参数速查表

参数全称作用
-c--create创建新归档
-x--extract提取文件
-t--list列出归档内容
-f--file=ARCHIVE指定归档文件名(几乎必带)
-v--verbose显示详细过程
-z--gzip用 gzip 压缩/解压(.tar.gz / .tgz)
-j--bzip2用 bzip2 压缩/解压(.tar.bz2)
-J--xz用 xz 压缩/解压(.tar.xz)
--zstd—用 zstd 压缩/解压(.tar.zst)
-C--directory=DIR切换到指定目录
-p--preserve-permissions保留权限
--exclude=PATTERN—排除文件
-X--exclude-from=FILE从文件读取排除规则
--strip-components=N—解压时去掉前 N 层目录

三、最常用命令(背下来这 10 个就够用了)

1. 创建压缩包

# .tar.gz(最常用)
tar -czvf archive.tar.gz file1 file2 dir/

# .tar.bz2(压缩率更高,速度更慢)
tar -cjvf archive.tar.bz2 file1 file2 dir/

# .tar.xz(压缩率最高,速度最慢)
tar -cJvf archive.tar.xz file1 file2 dir/

# .tar(不压缩,只打包)
tar -cvf archive.tar file1 file2 dir/

# .tar.zst(zstd,现代推荐)
tar --zstd -cvf archive.tar.zst file1 file2 dir/

参数解读(以第一个为例):

  • -c:创建
  • -z:用 gzip
  • -v:显示过程
  • -f archive.tar.gz:输出文件名(必须紧跟 f)

2. 解压

# .tar.gz(自动识别格式的简单版)
tar -xzvf archive.tar.gz

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

# .tar.bz2
tar -xjvf archive.tar.bz2

# .tar.xz
tar -xJvf archive.tar.xz

# .tar(不压缩的)
tar -xvf archive.tar

# .tar.zst
tar --zstd -xvf archive.tar.zst

3. 查看内容(不解压)

tar -tzvf archive.tar.gz

输出示例:

drwxr-xr-x user/user       0  6月  8 10:00 dir/
-rw-r--r-- user/user    1024  6月  8 10:00 dir/file.txt

4. 排除某些文件

# 排除单个文件/目录
tar -czvf backup.tar.gz --exclude='node_modules' --exclude='*.log' project/

# 从文件读取排除规则
echo "node_modules" > .tarignore
echo "*.log" >> .tarignore
tar -czvf backup.tar.gz -X .tarignore project/

5. 保留权限 / 所有者(备份时常用)

tar -czpf backup.tar.gz --same-owner --acls --xattrs /etc/
  • -p:保留权限
  • --same-owner:保留所有者(需要 root)
  • --acls --xattrs:保留 ACL 和扩展属性

四、压缩格式对比

格式扩展名压缩率速度典型用途
gzip.tar.gz .tgz中快最通用(网络传输、源码包)
bzip2.tar.bz2较高慢较少用
xz.tar.xz最高最慢Linux 内核、Arch 包
zstd.tar.zst中-高极快现代推荐(多线程)
无压缩.tar——内部处理

怎么选:

  • 通用场景 → .tar.gz
  • 追求压缩率 → .tar.xz
  • 追求速度 + 现代 → .tar.zst
  • 只是临时打包 → .tar

五、实用案例

案例 1:备份网站

# 打包整个网站目录
tar -czvf website-backup-$(date +%Y%m%d).tar.gz /var/www/html/

# 排除日志和缓存
tar -czvf website-backup-$(date +%Y%m%d).tar.gz \
  --exclude='*.log' \
  --exclude='cache/' \
  --exclude='tmp/' \
  /var/www/html/

案例 2:备份 MySQL 数据库 + 配合

# 先导出 SQL,再打包
mysqldump -u root -p dbname > dbname.sql
tar -czvf dbname-backup.tar.gz dbname.sql

案例 3:跨服务器传输(管道)

# 打包 + 传输 + 解压,一行搞定(无需中间文件)
tar -czvf - /var/www/html/ | ssh user@remote "tar -xzvf - -C /var/www/"

# 即:在 A 服务器打包 → 通过 ssh 传 → 在 B 服务器直接解压

案例 4:增量备份(–listed-incremental)

# 第一次全量
tar -czvf full-backup.tar.gz -g snapshot.file /data/

# 后续增量(只打包变化的文件)
tar -czvf incremental-backup.tar.gz -g snapshot.file /data/

案例 5:解压时去掉前 N 层目录

# 假设压缩包结构是:project-v1.0/src/main.c
# 解压时想去掉 project-v1.0/ 这一层
tar -xzvf project.tar.gz --strip-components=1

案例 6:不解压看某个文件的内容

# 提取单个文件到标准输出
tar -xzvf archive.tar.gz path/to/file.txt -O

# 用 grep 搜索
tar -xzvf archive.tar.gz -O | grep "error"

案例 7:分卷压缩(大文件)

# 切成 100M 一卷
tar -czvf - /big/dir/ | split -b 100M - backup.tar.gz.

# 合并
cat backup.tar.gz.* | tar -xzvf -

案例 8:Windows 上的 tar

# Windows 10/11 自带 tar(1903+),PowerShell/CMD 都能用
# 用法和 Linux 完全一样
tar -czvf backup.tar.gz C:\path\to\dir\
tar -xzvf backup.tar.gz -C C:\target\

六、常见错误及解决

1. 忘记写 -f

# ❌ 错误
tar -czv archive.tar.gz dir/
# 输出到 stdout,而不是文件

# ✅ 正确
tar -czvf archive.tar.gz dir/

2. 参数顺序错

# ❌ 错误(-f 后面跟的是参数,不是文件名)
tar -cvfz archive.tar.gz dir/
# tar: 错误选项 z

# ✅ 正确
tar -czvf archive.tar.gz dir/

规律:-f 必须紧跟文件名。所以 -czvf 正确,-cvfz 错误。

3. 权限丢失

# 解压后权限变成 777 或文件属主变了
# 解决:解压时加 -p
tar -xzpvf archive.tar.gz

4. 路径问题(绝对路径变相对路径)

# ❌ 直接打包绝对路径会有安全隐患
tar -czvf backup.tar.gz /etc/passwd
# 解压时会覆盖 /etc/passwd

# ✅ 改用相对路径
cd / && tar -czvf backup.tar.gz etc/passwd

5. “file changed as we read it”

# 警告:打包时文件正在被修改
# 解决:
# 1) 排除该文件
# 2) 复制到临时目录再打包
# 3) 用 --warning=no-file-changed 忽略警告
tar -czvf backup.tar.gz --warning=no-file-changed /data/

七、tar vs 其他压缩工具

工具特点何时用
tar打包 + 压缩,保留目录结构、权限首选(几乎所有场景)
zipWindows 友好、单文件友好需要给 Windows 用户发文件
7z压缩率最高大文件存储
gzip / bzip2 / xz单文件压缩tar 内部用
rsync增量同步跨服务器同步

日常使用:tar 覆盖 90% 场景。zip 只在给 Windows 用户发文件时用。


八、参数组合速记

想干啥命令
打包(gzip)tar -czvf
打包(xz)tar -cJvf
打包(zstd)tar --zstd -cvf
解压(自动)tar -xavf(-a 自动识别格式)
查看列表tar -tvf
解压到指定目录tar -xzvf x.tar.gz -C /dir/
排除文件tar -czvf x.tar.gz --exclude='*.log' dir/
保留权限tar -xzpvf
解压时改目录层数tar -xzvf x.tar.gz --strip-components=1

九、cheat sheet(一图流)

┌────────────────────────────────────────────┐
│  打包     tar -c[z|J]vf out.tar[.gz|.xz]   │
│          dir/                              │
│  解压     tar -x[z|J]vf in.tar[.gz|.xz]    │
│  查看     tar -t[z|J]vf in.tar[.gz|.xz]    │
│  排除     --exclude='*.log'                │
│  改目录   -C /target/                      │
│  去前缀   --strip-components=N             │
│  保留权限 -p                               │
└────────────────────────────────────────────┘

[z] = gzip   [J] = xz   --zstd = zstd

十、参考