适用:所有 Linux 耗时:约 20 分钟 前置:第一周 D6
.tar.gz 这个后缀把无数人劝退过。其实 tar 只有两个动作:打包和解包。
这一篇把这件事彻底说清,并给你一张"看到什么后缀用什么命令"的对照表。
一、先分清两件事:打包 和 压缩
| 动作 | 干什么 | 工具 |
|---|---|---|
| 打包(archive) | 把一堆文件塞进一个文件 | tar |
| 压缩(compress) | 让文件变小 | gzip / xz / zstd / zip |
关键认知:tar 本身不压缩,它只是打包。所以经常是"先打包,再压缩",两步:
一堆文件 --tar--> 一个 .tar --gzip--> .tar.gz
这也解释了后缀的含义:
| 后缀 | 意思 |
|---|---|
.tar | 只有打包,没压缩(体积大) |
.tar.gz = .tgz | 打包 + gzip 压缩(最常见) |
.tar.xz = .txz | 打包 + xz 压缩(更小,更慢) |
.tar.bz2 | 打包 + bzip2(老的,少见了) |
.zip | Windows 风格:打包和压缩是一体的 |
.7z | 7-Zip,压缩率高 |
.gz(不带 tar) | 单个文件压缩,不是打包 |
一个最容易搞混的点:
.gz只能压缩一个文件,不能打包多个。所以.tar.gz是先打包成一个.tar,再把这个.tar压成.gz。
二、tar 的两个命令解决 90%
解包(最常用)
tar -xzf 文件.tar.gz
四个字母的意思:
| 字母 | 含义 | 记忆 |
|---|---|---|
-x | eXtract,解包 | 解 |
-z | 用 gZip 处理 | 对应 .gz |
-f | 后面跟文件名 | file |
-v | 显示过程 | verbose,可选 |
加 -v 看进度(推荐):
tar -xzvf 文件.tar.gz
打包
tar -czf 打包.tar.gz 目录名/
| 字母 | 含义 |
|---|---|
-c | Create,创建 |
-z | gzip 压缩 |
-f | 文件名 |
记忆口诀:-c 是打包(Create),-x 是解包(eXtract),其他都一样。
顺序很重要:
-f后面必须紧跟文件名。tar -czf 名字.tar.gz 源目录✅tar -cfz 名字.tar.gz 源目录❌(-f会把z当文件名)
三、后缀对照表(保存这个)
| 你看到 | 解包命令 |
|---|---|
xxx.tar.gz / xxx.tgz | tar -xzvf xxx.tar.gz |
xxx.tar.xz / xxx.txz | tar -xJvf xxx.tar.xz |
xxx.tar.bz2 | tar -xjvf xxx.tar.bz2 |
xxx.tar | tar -xvf xxx.tar |
xxx.zip | unzip xxx.zip |
xxx.7z | 7z x xxx.7z |
xxx.gz(单文件) | gunzip xxx.gz 或 gzip -d xxx.gz |
xxx.rar | unrar x xxx.rar(要先装) |
注意 tar.xz 用的是大写的 -J(不是小写 j)。这是最容易打错的一个。
记不住的替代方案:
tar -xf 文件.tar.任意后缀现代 GNU tar 能自动识别压缩格式,不用手动指定
-z/-J/-j。这是最省事的写法。
四、五个高频实用场景
1. 打包时排除某些文件
tar -czf backup.tar.gz 项目/ --exclude='*.log' --exclude='node_modules'
多个 --exclude 可以叠加。 备份代码时特别有用。
2. 解压到指定目录
mkdir -p /tmp/解压到这里
tar -xzf 文件.tar.gz -C /tmp/解压到这里
-C(大写)指定目标目录,前提是目录已存在。
3. 只看内容不/解压
tar -tzf 文件.tar.gz
-t = list,列出里面有什么。解压前先看一眼,避免解出一堆东西到当前目录。
4. 只解压其中某个文件
tar -xzf 文件.tar.gz 路径/文件名
先 -t 看路径,再指定。
5. 打包但排除目录本身
# 这样打包,解压后会多一层 项目/ 目录
tar -czf b.tar.gz 项目/
# 这样打包,解压后直接是内容,没有外层目录
tar -czf b.tar.gz -C 项目 .
第二个写法是"打包目录内容"而不是"打包目录",做部署包时常用。
五、zip:和 Windows 交换时用
Linux 有自己的 tar,但和 Windows 用户交换文件时,zip 更保险(Windows 能直接双击打开)。
# 压缩
zip -r 打包.zip 目录名/
# 解压
unzip 打包.zip
# 看内容
unzip -l 打包.zip
# 解压到指定目录
unzip 打包.zip -d /tmp/目标
-r 必须加(递归),否则只压目录本身,不压里面的内容。
装 zip:
sudo apt install zip unzip # Debian 系
sudo dnf install zip unzip # RPM 系
六、中文文件名乱码问题
这是和 Windows 交换文件时最烦的问题。
现象
Windows 上用 WinRAR 打的 zip,在 Linux 里解开,中文文件名变成 ???? 或乱码。
原因
Windows 中文版 zip 用 GBK 编码存文件名,Linux 默认按 UTF-8 解。
修法
# 方法 1:指定编码解压(推荐)
unzip -O GBK 文件.zip
# 方法 2:用 7z(自动处理更好)
7z x 文件.zip
# 方法 3:转码已有文件名
convmv -f GBK -t UTF-8 --notest 目录/
unzip -O GBK 是最直接的。 如果 unzip 版本不支持 -O(有些系统编译时没开),用 7z x。
反向:Linux 打包给 Windows
用 zip 而不是 tar.gz(Windows 默认不认识 tar.gz):
zip -r 给windows.zip 目录/
Linux 的 zip 默认用 UTF-8,Win10 以后能正确识别。再老的 Windows 可能还是乱码,那种情况建议改用 7z 格式(7z a)。
七、动静对比:选哪个压缩格式
| 格式 | 压缩率 | 速度 | 适合 |
|---|---|---|---|
.tar | 无 | 极快 | 临时打包,马上就用 |
.tar.gz | 中 | 快 | 通用首选 |
.tar.xz | 高 | 慢 | 发布包、长期归档 |
.tar.zst | 高 | 很快 | 现代系统的备份 |
.zip | 中 | 中 | 和 Windows 交换 |
.7z | 最高 | 慢 | 大文件归档 |
实用建议:
- 日常备份 →
tar.gz - 给别人发 →
zip(Windows 友好) - 长期存 →
tar.xz - 追求速度 →
tar.zst(如果系统支持)
八、动手:五个练习
练习 1:打包一个目录再解开
mkdir -p /tmp/lab/src && cd /tmp/lab/src
echo "hello" > a.txt
mkdir sub && echo "world" > sub/b.txt
cd /tmp/lab
tar -czf pack.tar.gz src/
ls -lh pack.tar.gz # 看大小
mkdir -p /tmp/lab/out
tar -xzf pack.tar.gz -C /tmp/lab/out
find /tmp/lab/out -type f
练习 2:打包前先看内容
tar -tzf /tmp/lab/pack.tar.gz
养成这个习惯——解压前先看一眼。
练习 3:排除文件打包
cd /tmp/lab
echo "log data" > src/app.log
tar -czf clean.tar.gz src/ --exclude='*.log'
tar -tzf clean.tar.gz # app.log 应该不在里面
练习 4:用 zip 并查看
cd /tmp/lab
zip -r pack.zip src/
unzip -l pack.zip
练习 5:比较压缩率
cd /tmp/lab
tar -cf plain.tar src/
tar -czf gz.tar.gz src/
tar -cJf xz.tar.xz src/
ls -lh plain.tar gz.tar.gz xz.tar.xz
小文件看不出差别。 换成一个大文本文件(或整个 /usr/share/doc)再比,差距会很明显。
九、验证:你过关了吗
- 能说清"打包"和"压缩"的区别
- 会用
tar -czf打包、tar -xzf解包 - 知道
-c是打包、-x是解包 - 会用
tar -tzf先看内容再解压 - 知道
.tar.xz用大写-J - 会用
--exclude排除文件 - 知道和 Windows 交换用
zip - 知道中文乱码用
unzip -O GBK
十、不行怎么办
Q1:tar: This does not look like a tar archive
文件不是 tar 格式(可能是 zip 改了后缀),或者下载不完整。
file 文件.tar.gz # 看真实类型
Q2:tar: Unexpected EOF in archive
文件损坏或不完整。重新下载。
Q3:解压时提示 Cannot open: Permission denied
当前目录没写权限:
sudo tar -xzf 文件.tar.gz -C /opt/
Q4:unzip 不存在
sudo apt install unzip
Q5:unzip -O 报 invalid option
这个版本的 unzip 没编译 GBK 支持。改用:
7z x 文件.zip # 需要先装 p7zip-full
Q6:解压出来一堆文件散在当前位置,很乱
撤销不了——解压前先建目录,用 -C。以后养成习惯:
mkdir -p 目标目录 && tar -xzf 文件.tar.gz -C 目标目录
Q7:打包时提示 file changed as we read it
打包过程中文件被改了(常见于打包正在写的日志)。加 --warning=no-file-changed 忽略,或者先停掉写文件的进程。
十一、一句话总结
tar 只有两个动作:
-czf打包、-xzf解包。记不住后缀就
tar -xf让它自己认。解压前先
tar -tzf看一眼,解压时用-C指定目录。
← 上一篇 T1|文本编辑器 下一篇 → T3|SSH:从密码登录到密钥免密