.tar.gz 的双后缀之谜:先打包,后压缩,缺一不可
今天下午摸鱼翻代码新来的实习生凑过来问我“哥为什么这 Linux 里的文件后缀怎么跟老太太的裹脚布一样有 .tar.gz 两个后缀啊直接 .tgz 不行吗非要这么啰嗦”我看着屏幕手里的瑞幸突然就不香了。这种问题要是搁我十年前刚进厂那会儿带我的师傅估计直接一巴掌呼过来然后甩我一句“去读读 Unix 哲学”但现在我这发际线也退得差不多了脾气也磨没了只想和你们这帮年轻人唠唠这种看似“脱裤子放屁”的设计背后藏着多少程序员的浪漫和辛酸。先讲个我当年的糗事吧刚入行那会儿我第一次从网上下载了一个 nginx.tar.gz。看着这个后缀我心想这不就是压缩包吗跟 .zip 一个意思吧。然后我直接 unzip nginx.tar.gz。报错。我又试了 gzip -d nginx.tar.gz解出来一个 nginx.tar我当时就懵了——这玩意儿怎么还有一层这是什么套娃操作后来才搞明白tar 和 gzip 压根就是两回事。你以为它是个整体其实它是“两兄弟”接力很多习惯了 Windows 的同学觉得压缩包就该是一个东西。但你仔细看.tar 和 .gz 压根不是一回事。.tar 的全称是 Tape Archive听听这名字带磁带Tape的一股子旧时代的霉味儿。在那个还是用磁带存数据的年代这玩意儿的作用只有一个就是把一堆散乱的文件“打包”成一个大块头它自己其实是不负责压缩的。你打包完一看嘿这 .tar 包可能比原来的文件夹还大一点点因为得存点文件头信息。那 .gz 又是干啥的它是 Gzip 压缩出来的后缀。这时候 Unix 那帮怪癖大佬的逻辑就出来了我负责打包你负责压缩咱俩各干各的。你要是只想要个包你就 .tar你要是想省空间就再给这个包套一层 .gz。这种“一次只做一件事”的执拗就是所谓的 Unix 哲学。你说费劲不确实费劲。但你说它灵活不那是真的爽。就比如你去超市买了一大堆东西有可乐、薯片、方便面、辣条。收银员给你一个塑料袋全装进去——这个动作叫tar打包。然后你又觉得袋子太鼓占地方找了个抽气泵把空气抽掉袋子瘪了——这个动作叫gzip压缩。反过来你拿到的那个瘪瘪的袋子就是 .tar.gz。如果你只想抽真空但可乐瓶子会变形啊。所以必须先装袋再抽气。这就是为什么得两个步骤、两个后缀。那 .tgz 呢其实就是 .tar.gz 的缩写偷懒用的。你要是用 file 命令看一眼系统照样认它是 gzip 压缩的 tar 归档。看到这儿你也许就能理解为什么我们要把“打包”和“压缩”分开看。在 Linux 的管道Pipe世界里你可以随心所欲地组合。你想用 Bzip2 压那就叫 .tar.bz2你想用最新的 XZ 压那就叫 .tar.xz。这种模块化的思维其实给了我们很多退路。你不需要为了换一种压缩算法就去重造一遍“打包”的轮子。这就好比你搬家.tar 是那个负责把衣服塞进大纸箱的力工而 .gz 是那个抽干真空袋空气的机器。你总不能要求抽真空的机器还得负责帮你折衣服吧那为什么不像 .zip 那样一步到位呢肯定有人要反驳我了人家 .zip一个后缀啥都干了.7z 也是.rar 也是。可是打包压缩一体化的多先进啊兄弟这你就年轻了。你试过在 Linux 下解压一个几万个小文件的 .zip 包吗万一编码弄错了那文件名全是乱码删都删不掉能让你哭出声来。更核心的原因在于.tar 在打包的时候能把文件的权限、所有者、软链接这些“灵魂信息”全部原封不动地保留下来。这对于服务器环境来说简直是保命的东西。你要是随便弄个 .zip 拷过去权限全丢了你跑个脚本试试分分钟给你报 Permission denied 报到你怀疑人生。这种对“元数据”的尊重是 Windows 系压缩格式很难彻底解决的痛点。你肯定也见过 .tar.bz2、.tar.xz、.tar.zst…… 原理一模一样只是换了不同的压缩算法。bz2 压缩率更高但慢zst 又快压缩率也不错看场景选。这就是 Unix 哲学每个程序只做一件事然后把它做好。tar 负责打包gzip 负责压缩管道一接各干各的。当然这话说出来显得我很装。但现实就是这种“笨办法”活了四十多年反而成了最灵活的设计。其实我们这些老家伙就是喜欢这种破碎感有时候我也在想是不是我们这代程序员被虐习惯了看着那串长长的 tar -zxvf filename.tar.gz 命令行我竟然觉得有一种莫名的安全感。字母 z 代表 gzipx 代表 extractv 代表 verbose就是让你看着它跳出来的文件心里踏实f 代表 file。这种掌控感是点一下右键“解压到当前文件夹”给不了的。现在的工具确实越来越傻瓜化了很多时候你双击一个 .tar.gz系统背后其实偷偷帮你跑了好几串命令。但我还是建议你哪天闲着没事去试试只打包不压缩或者换个压缩插件试试。当你能理解这种“两段式”的设计逻辑时你可能才算真正摸到了 Linux 那层冰冷又迷人的天灵盖吧。好了不瞎扯了这大周五的真是一周里最难熬的一天准备休息了毕竟头发真的不多了哈。你说这生活是不是也得像 .tar.gz 一样先把乱七八糟的琐事打包好再想办法把自己“压缩”进那一丁点休息时间里呢哎溜了溜了。往期文章推荐不懂 内存管理别再说你懂 Linux 内核了为什么很多人劝退学 C但大厂核心岗位还是要 C【大厂标准】Linux C/C 后端进阶学习路线音视频流媒体高级开发-学习路线C Qt学习路线一条龙桌面开发嵌入式开发Linux内核学习指南硬核修炼手册C/C 高频八股文面试题1000题三手撕线程池C程序员的能力试金石