我有gzip文件列表:
file1.gz
file2.gz
file3.gz
有没有一种方法可以将这些文件串联或gzip压缩为一个gzip文件, 而不必将其解压缩?
实际上,我们将在Web数据库(CGI)中使用它。网络将从用户那里接收查询,并根据查询列出所有文件,并将它们以批处理文件的形式呈现给用户。
Answers:
使用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格式规范。
cat
答案相同,但有一些额外的元数据。您以后可以解压缩它们以获取原始文件名,然后根据需要解压缩全部或仅几个文件。
.zip
文件的评论。使用gzip(或bzip2)算法将多个文件放到一个压缩存档中的标准方法是使用tar:tar
将文件放在一起(未压缩)并保留文件名和属性,gzip的工作是压缩结果。甚至可以使用的-z
选项一步完成tar
。产生的文件扩展名是.tar.gz
或.tgz
。如果您要将已经压缩的.gz文件放在一起,只需使用tar。它没有做任何进一步的压缩,这对于已经压缩的文件是有意义的。
zcat
解压缩其输入,以便为您提供带.gz
扩展名的解压缩输出。
这是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的补充,而不是替代。
您可以创建这些文件的tar文件,然后gzip压缩tar文件以创建新的gzip文件
tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar
cat file1.gz file2.gz file3.gz > allfiles.gz
。真的就是这么简单:)