有没有一种 GZIP 合并工具可以在不解压缩的情况下合并两个 GZIP 文件?

14
假设有a.gz和b.gz两个文件。 $ gzip_merge a.gz b.gz -output c.gz
我想要这样一个程序。当然, $ cat a.gz b.gz > c.gz
不起作用。因为a.gz的最后一个DEFLATE块具有BFINAL,而b.gz则有GZIP头部。(参见RFC1951、RFC1952)但是如果您取消BFINAL、丢弃第二个GZIP头部并穿过第二个gzip文件的字节边界,则可以合并它。
事实上,我曾考虑写一个开源程序来解决这个问题,但不知道如何发布。所以我请Joel担任我的项目经理,向他解释和辩护,他最终明白了我的意图,但说他太忙了。 :(
当然,我可以自己编写并尝试发表它。但我无法独自完成,因为我的日常工作属于雇主的财产。
是否有志愿者?我们可以作为程序员(我),出版商(你)或程序员(你),出版商(我)一起工作。我所需要的只是一些信用。我曾经实现过在RFC3320中描述的通用解压缩器虚拟机。所以我知道这是可行的。
或者,您可以指引我去找那个程序。对于管理日志文件(如将365(天)gzipped日志文件合并为一个文件)非常有用。 ; )
谢谢。

只是出于好奇,你为什么要这样做呢?如果你只想将某些东西表示为单个文件,为什么不直接打包成tar文件呢? - Jason Coco
1
如果你有一个MVC框架,并想加快头部模板、动态内容模板和底部模板的交付速度,你可以选择压缩。如果你事先压缩头部模板和底部模板,这样做可能会加快速度。 - yogman
2个回答

34

当然,执行 cat a.gz b.gz > c.gz 并不能实现目标。

实际上,它可以正常工作。我刚刚测试过了。甚至在gzip手册页上有记录(有点)。

   Multiple  compressed  files  can  be concatenated. In this case, gunzip
   will extract all members at once. For example:

         gzip -c file1  > foo.gz
         gzip -c file2 >> foo.gz

   Then

         gunzip -c foo

   is equivalent to

         cat file1 file2

1
哦,它运行得非常好!谢谢!我想这一切都可以使用像PerlIO::gzip这样的Perl实现来完成。 - yogman
创建文件方面,我不会有任何问题。阅读文件的话,在最坏的情况下,您可以使用循环或外壳调用zcat/gunzip。 - Andru Luvisi

6

您也可以:

zcat a.gz b.gz > c.txt && gzip c.txt

只要你的Linux/Unix发行版内置了zcat(大多数都有,如果没有可以安装),就可以执行此操作。
或者:
zcat a.gz b.gz | gzip -c > c.txt.gz

这是我在使用已压缩文件时的解决方案。Andru Luvisi的解决方案是从未压缩的文件开始的。 - Gildas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接