公众号旧文
为什么 nginx.tar.gz 看上去好像有两个扩展名?
起因是胖子在访问 nginx 官网的时候,看到了文档里的命令:
wget https://nginx.org/download/nginx-1.29.3.tar.gz && \
tar zxf nginx-1.29.3.tar.gz && \
cd nginx-1.29.3
nginx-1.29.3.tar.gz 看上去是压缩包,却好像有两个扩展名。
胖子不禁产生疑惑:
为什么一个压缩包会有两个扩展名?
经过一番探索才知道,原来.tar.gz并不是一个单独的文件格式,而是两个处理步骤叠加在一起的结果。
简单说.tar.gz就是:先打包,再压缩。
一、.tar:打包(archive)
.tar 来自 Tape ARchive。
在早期 Unix 系统中,它用于把很多文件合并成一个文件,方便备份到磁带等存储设备。
.tar 的特点是:
- 只是把多个文件打包在一起
- 不会压缩体积
- 会保留文件信息,例如
例如有这样一个目录:
project/
├─ a.txt
├─ b.txt
└─ img/
执行 tar 打包后会变成:
project.tar
但文件大小几乎不会变化,因为它只是合并。
二、.gz:压缩(gzip)
.gz 是 gzip 压缩格式,由 GNU Project 提供的压缩工具 gzip 生成。
它的特点:
- 用来压缩文件
- 减小体积
- 但通常只能压缩单个文件
例如:
project.tar
↓ gzip
project.tar.gz
三、.tar.gz 的完整过程
真实发生的流程是:
多个文件
↓
tar 打包
↓
archive.tar
↓
gzip 压缩
↓
archive.tar.gz
因此可以理解为:
.tar.gz = tar + gzip
所以 .tar.gz 看起来像双扩展名,其实是两个工具的结果叠加。
四、那为什么 Linux 要这样做?
因为许多传统压缩算法(例如 gzip、bzip2、xz):
只能压缩一个文件流,不能直接压缩目录。
所以 Unix 的经典做法就是:
先 tar
再 gzip
这也是 Linux 世界几十年来的习惯。
五、类似的“双扩展名”还有很多
在 Linux 软件或源码包中,经常还能看到这些格式:
| 文件名 | 含义 |
|---|---|
.tar.gz |
tar + gzip |
.tar.bz2 |
tar + bzip2 |
.tar.xz |
tar + xz |
.tar.zst |
tar + zstd |
例如 Linux 内核源码通常是:
linux-6.x.tar.xz
六、.tgz 其实就是 .tar.gz
``
有时候你会看到另一种写法:
file.tgz
它其实只是 .tar.gz 的缩写形式:
.tgz ≈ .tar.gz
这种缩写来自早期 Unix 的习惯,当时很多人喜欢把扩展名写短一点。
类似的缩写还有:
| 简写 | 完整写法 |
|---|---|
.tgz |
.tar.gz |
.tbz |
.tar.bz2 |
.txz |
.tar.xz |
七、一个真实例子:Tailscale 安装包
例如安装 Tailscale 时,有时会下载这样的文件:
tailscale_1.94.2_amd64.tgz
它的扩展名是:
.tgz
含义就是:
tar 打包 + gzip 压缩
解压方法也非常简单:
tar -xzf tailscale_1.94.2_amd64.tgz
这里的 tar 会自动调用 gzip 进行解压。
八、为什么 Windows 很少看到这种格式?
因为 Windows 世界常见的压缩格式,例如:
- WinRAR的 .rar
- 7-Zip的 .7z
通常都是打包和压缩一步完成。
因此只需要一个扩展名,例如:
file.zip
而不需要:
file.tar.zip
总结
.tar.gz 之所以看起来像“双扩展名”,是因为它表示两个连续操作:
.tar.gz = tar 打包 + gzip 压缩
而 .tgz 只是 .tar.gz 的简写。
这种设计是 Unix 世界几十年来的传统,也因此在 Linux 软件发布、源码分发中被广泛使用。
扩展阅读: