适用:所有 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(老的,少见了)
.zipWindows 风格:打包和压缩是一体的
.7z7-Zip,压缩率高
.gz(不带 tar)单个文件压缩,不是打包

一个最容易搞混的点:.gz 只能压缩一个文件,不能打包多个。所以 .tar.gz 是先打包成一个 .tar,再把这个 .tar 压成 .gz。


二、tar 的两个命令解决 90%

解包(最常用)

tar -xzf 文件.tar.gz

四个字母的意思:

字母含义记忆
-xeXtract,解包解
-z用 gZip 处理对应 .gz
-f后面跟文件名file
-v显示过程verbose,可选

加 -v 看进度(推荐):

tar -xzvf 文件.tar.gz

打包

tar -czf 打包.tar.gz 目录名/
字母含义
-cCreate,创建
-zgzip 压缩
-f文件名

记忆口诀:-c 是打包(Create),-x 是解包(eXtract),其他都一样。

顺序很重要:-f 后面必须紧跟文件名。 tar -czf 名字.tar.gz 源目录 ✅ tar -cfz 名字.tar.gz 源目录 ❌(-f 会把 z 当文件名)


三、后缀对照表(保存这个)

你看到解包命令
xxx.tar.gz / xxx.tgztar -xzvf xxx.tar.gz
xxx.tar.xz / xxx.txztar -xJvf xxx.tar.xz
xxx.tar.bz2tar -xjvf xxx.tar.bz2
xxx.tartar -xvf xxx.tar
xxx.zipunzip xxx.zip
xxx.7z7z x xxx.7z
xxx.gz(单文件)gunzip xxx.gz 或 gzip -d xxx.gz
xxx.rarunrar 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:从密码登录到密钥免密