我知道我们可以轻松连接多个 gzip 压缩文件来创建一个包含所有数据的大(有效)gzip 文件:
gzip -c A > A.gz
gzip -c B > B.gz
cat A.gz B.gz > AB.gz
如果我解压生成的结果
AB.gz
,我会得到A和B的内容:
cat A B > ab
gzip -dc AB.gz > AB
diff ab AB
但是,我想单独恢复输入文件。
现在
gzip(1)
相当明确:
如果您希望创建包含多个成员的单个存档文件,以便以后可以独立提取成员,请使用 tar 或 zip 等存档程序。 [...]gzip 被设计为 tar 的补充,而不是替代品。
不幸的是,我不能真正使用
tar
作为中间层(出于$原因)。
由于 gzip 将元信息存储在 gz 文件(原始文件名)中,并且我可以连接各个 gz 文件,因此我认为必须有一些块标记,因此 gzip 知道它需要重置。
但是:怎么办?
有一个
--name
标志可以按原始名称恢复(单个)成员,但对于多成员 gzip 文件,它将仅使用第一个成员的名称来恢复连接的内容:
gzip -kdN AB.gz
如果使用
gzip
cmdline 工具无法做到这一点,Python 解决方案也可以......
不,不能使用命令行工具。搜索 gzip 标头可能会导致误报。没有什么可以阻止,例如,
1f 8b 08
出现在压缩数据中。事实上,它很可能不止一次地出现在 100 MB 的压缩数据中。
Python 模块不提供从 gzip 标头恢复名称的方法。您需要自己解析每个 gzip 标头,然后在每个 gzip 标头之后的原始 deflate 数据上使用
zlib.decompressobj()
,以及 zlib.crc32()
来计算未压缩数据的 CRC-32 以与预告片进行比较。 deflate 流是自动终止的。有关 gzip 标头和标尾的详细信息,请参阅 RFC 1952。