从串联的 gzip 压缩文件中提取单个文件

问题描述 投票:0回答:1

我知道我们可以轻松连接多个 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 解决方案也可以......

python sh extract gzip
1个回答
0
投票

不,不能使用命令行工具。搜索 gzip 标头可能会导致误报。没有什么可以阻止,例如,

1f 8b 08
出现在压缩数据中。事实上,它很可能不止一次地出现在 100 MB 的压缩数据中。

Python 模块不提供从 gzip 标头恢复名称的方法。您需要自己解析每个 gzip 标头,然后在每个 gzip 标头之后的原始 deflate 数据上使用

zlib.decompressobj()
,以及
zlib.crc32()
来计算未压缩数据的 CRC-32 以与预告片进行比较。 deflate 流是自动终止的。有关 gzip 标头和标尾的详细信息,请参阅 RFC 1952

© www.soinside.com 2019 - 2024. All rights reserved.