公众号旧文

为什么 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 软件发布、源码分发中被广泛使用。

扩展阅读:


JS challenge 到底在 challenge 什么?

为什么表和钟偶尔要对时,电脑却几乎不用?

我给公众号做了一个“阅读量监控系统”。

你每天上网都在使用的IP,是谁分配给你的?