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 | 打包 + 压缩,保留目录结构、权限 | 首选(几乎所有场景) |
zip | Windows 友好、单文件友好 | 需要给 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
十、参考
man tar(最权威)- GNU tar 官方文档
- Arch Wiki: tar