为什么不能直接用 cat 拼接 .tar.gz 文件
来源: alexwlchan.net — 2026-08-20
概述
作者要合并多个 .tar.gz 归档,原以为把字节拼起来就行,结果失败。为了修好代码,他先修了自己的心智模型,一路讲到磁带、专利法与文件结束标记:tar 诞生于磁带时代,本质是顺序读写、只追加写、定长块,文件之后跟着若干全零块构成 EOF 标记,读者到此就停下,所以被拼在后面的第二个归档会被直接忽略。gzip 则是单数据流压缩器,出身是规避 LZW 专利的自由软件替代品,设计上要求流式、内存有界、可移植。
核心要点
- tar 是 tape archive 的缩写,结构由磁带的物理限制决定:顺序读、只追加写、定长数据块。
- 归档中文件之后是两个以上全零块组成的 EOF 标记,其后内容一律被忽略,所以 cat 拼起来的第二个归档读不到。
- 因为无法改写磁带上的块,更新文件只能追加同名的新版本,解包时后写的会覆盖先写的。
- 文件大小必须在头部预先声明,用 Python 的 addfile 忘了写 size 就会得到空归档。
- gzip 的诞生是为了替代受 LZW 专利保护的 compress,因此强调流式处理与内存占用有界。
- 正确做法是用 tarfile 逐成员复制进一个新归档,只留一个 EOF 标记,不依赖 --ignore-zeros。
金句
为了修好代码,我得先修好我脑子里的模型。
👍 0
👎 0
返回 Lobsters 首页