快速串联多个GZip文件


92

我有gzip文件列表:

file1.gz
file2.gz
file3.gz

有没有一种方法可以将这些文件串联或gzip压缩为一个gzip文件, 而不必将其解压缩

实际上,我们将在Web数据库(CGI)中使用它。网络将从用户那里接收查询,并根据查询列出所有文件,并将它们以批处理文件的形式呈现给用户。

Answers:


107

使用gzip文件,您可以简单地将文件串联在一起,如下所示:

cat file1.gz file2.gz file3.gz > allfiles.gz

根据gzip RFC

一个gzip文件由一系列“成员”(压缩数据集)组成。[...]成员只是在文件中一个接一个地出现,在它们之前,之间或之后没有其他信息。

请注意,这与为连接的数据构建单个gzip文件并不完全相同。除其他事项外,所有原始文件名均被保留。但是,gunzip似乎将其视为串联。

由于现有工具通常会忽略其他成员的文件名标头,因此很难从结果中提取单个文件。如果您希望做到这一点,请改为构建一个ZIP文件。ZIP和GZIP都使用DEFLATE算法进行实际压缩(ZIP支持其他一些压缩算法以及一个选项-方法8是与GZIP压缩相对应的方法);区别在于元数据格式。由于元数据是未压缩的,因此剥离gzip标头并粘贴到ZIP文件标头和中央目录记录就足够简单了。请参考gzip格式规范ZIP格式规范


41
不。只是cat file1.gz file2.gz file3.gz > allfiles.gz。真的就是这么简单:)
bdonlan

1
从技术上讲,它们是保留的。仅仅是现有工具通常没有能力分别提取它们。您可能需要研究构建ZIP头和目录-ZIP格式使用相同的基础压缩算法,因此只需更改(未压缩的)元数据即可。看一下gzip.org/zlib/rfc-gzip.html(源格式)和pkware.com/documents/casestudies/APPNOTE.TXT
bdonlan

20
比构建zip gz文件更好,只是将它们压缩。与cat答案相同,但有一些额外的元数据。您以后可以解压缩它们以获取原始文件名,然后根据需要解压缩全部或仅几个文件。
sorpigal 2011年

1
这里有很多关于.zip文件的评论。使用gzip(或bzip2)算法将多个文件放到一个压缩存档中的标准方法是使用tar:tar将文件放在一起(未压缩)并保留文件名和属性,gzip的工作是压缩结果。甚至可以使用的-z选项一步完成tar。产生的文件扩展名是.tar.gz.tgz。如果您要将已经压缩的.gz文件放在一起,只需使用tar。它没有做任何进一步的压缩,这对于已经压缩的文件是有意义的。
Daniel Alder 2014年

2
@alvas,zcat解压缩其输入,以便为您提供带.gz扩展名的解压缩输出。
bdonlan

51

这是man 1 gzip关于您的要求的说明。

可以压缩多个压缩文件。在这种情况下,gunzip将立即提取所有成员。例如:

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

然后

gunzip -c foo

相当于

cat file1 file2

不用说,file1可以替换为file1.gz

您必须注意以下几点:

gunzip将立即提取所有成员

因此,要单独获得所有成员,如果需要的话,您将不得不使用其他或书写的内容。

但是,这也可以在手册页中解决。

如果您希望创建一个具有多个成员的存档文件,以便以后可以独立提取成员,请使用tar或zip等存档器。GNU tar支持-z透明调用gzip的选项。gzip设计为tar的补充,而不是替代。


13

只是用猫。速度非常快(对我来说500 MB为0.2秒)

cat *gz > final
mv final final.gz

然后,您可以使用zcat读取输出以确保它很漂亮:

zcat final.gz

我尝试了'gz -c'的另一个答案,但是当使用已经压缩的文件作为输入时,我最终得到了垃圾(我猜是它对它们进行了两次压缩)。

PV:

更好的是,如果有的话,请使用“ pv”代替cat:

pv *gz > final
mv final final.gz

这样可以为您提供进度条,但其功能与cat相同。


11

您可以创建这些文件的tar文件,然后gzip压缩tar文件以创建新的gzip文件

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar

8
为什么您应该精确gzip新的tar文件?它已经压缩了(除了tar的元数据,该数据应该很小)。
thiton

2
你是对的。无论是否gzip,文件大小都不会有太大差异,因为单个文件已经被gzip压缩了。仅仅是因为他想从三个单独的文件中获取gzip文件。
德罗纳

1
额外的gzip只会减慢对内容的访问速度,而不会增加收益。在我看来,OP的要求实际上是结果归档文件必须是单个文件,没有理由假设结果文件应该是gzip文件。
mc0e 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.