这个问题问得好,它正...

这个问题问得好,它正好卡在“Unix 没有文件类型”和“人类需要类型”之间。我会这么回答:

因为 .tar.gz 不是一个后缀,是两个操作叠出来的名字,而 Unix 的文件名本来就不负责表达类型。

拆开看:

.tar 是打包,把一堆文件合成一个文件,不压缩,只归拢。.gz 是压缩,用 gzip 把单个文件压小。你要“把目录打成压缩包”,实际做的是两步:先 tar 打包,再 gzip 压缩。所以文件名自然写成 .tar.gz——先打包,后压缩,名字按操作顺序排。

.tgz 不是另一种格式,它是 .tar.gz 的缩写,历史上为了兼容早期文件系统 8.3 文件名限制(最多 8 个字符主名 + 3 个字符扩展名)而出现的短写法。它在功能上完全等价,tar xzf foo.tgz 和 tar xzf foo.tar.gz 没有区别。

但为什么主流还是写 .tar.gz 而不写 .tgz?三个原因:

第一,Unix 的文件名不承载类型信息。 文件的“类型”由内容决定,不由后缀决定。file foo 读的是文件头部的 magic number,不是看名字。所以后缀在这里的作用不是“告诉系统这是什么”,而是“告诉人这是怎么来的”。.tar.gz 比 .tgz 更清楚地表达了“先 tar 后 gz”这个构造过程。

第二,多后缀是组合,不是啰嗦。 .tar.bz2、.tar.xz、.tar.zst 都是同一个逻辑:打包格式 + 压缩格式。你看到 .tar.xz 就知道“tar 打包、xz 压缩”,看到 .tgz 只能猜“大概是 tar.gz 吧”。多后缀在信息密度上是更高的。

第三,约定比长度重要。 .tgz 能用,但很多工具、文档、脚本默认认 .tar.gz。你写 .tgz 不会错,但别人看到会多问一句“这是不是 tar.gz”,多一次确认成本。约定俗成的写法减少沟通成本。

最后可以补一句给实习生:Unix 里后缀是给人看的,不是给系统看的。 你完全可以把一个 gzip 压缩的 tar 包命名为 foo.txt,tar xzf foo.txt 照样能解开——因为 tar 读的是文件头,不是名字。但这么做会让下一个人想打你。后缀的用途是“让人在打开之前就知道这是什么”,不是“让系统知道怎么处理它”。

如果他想再深一层,可以告诉他:这也是为什么 Linux 里可执行文件没有 .exe 后缀,靠的是权限位(chmod +x)和文件头(#! 或 ELF magic),不是靠名字。名字是给人用的,类型是给系统用的,这两件事在 Unix 里是分开的。