多个GZip文件的快速连接

nev*_*int 81 unix linux compression gzip

我有gzip文件列表:

file1.gz
file2.gz
file3.gz
Run Code Online (Sandbox Code Playgroud)

有没有办法将这些文件连接或gzipping到一个gzip文件 而不必解压缩

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

bdo*_*lan 90

使用gzip文件,您可以简单地将文件连接在一起.根据gzip RFC,

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

请注意,这与构建连接数据的单个gzip文件不完全相同; 除其他外,保留所有原始文件名.然而,gunzip似乎把它当作串联来处理.

由于现有工具通常会忽略其他成员的文件头,因此从结果中提取单个文件并不容易.如果您希望这样做,请改为构建ZIP文件.ZIP和GZIP都使用DEFLATE算法进行实际压缩(ZIP支持一些其他压缩算法以及一个选项 - 方法8是与GZIP压缩相对应的方法); 不同之处在于元数据格式.由于元数据是未压缩的,因此它很容易剥离gzip标头并改为使用ZIP文件头和中央目录记录.请参阅gzip格式规范ZIP格式规范.

  • 不.只是`cat file1.gz file2.gz file3.gz> allfiles.gz`.它真的很简单:) (40认同)
  • 比构建一个gz文件的zip更好,只需要tar它们.它与`cat`答案相同,但有一些额外的元数据.您可以稍后解压缩它们以获取原始文件名,然后根据需要解压缩所有或仅几个. (20认同)
  • 显然,有些工具在到达第一个 gzip 成员的末尾时会错误地停止。https://github.com/pysam-developers/pysam/issues/738#issuecomment-487958180 (3认同)
  • 从技术上讲,它们被保留了下来。只是现有的工具一般不具备单独提取的能力。您可能想要研究构建 ZIP 标头和目录 - ZIP 格式使用相同的底层压缩算法,因此只需更改(未压缩的)元数据即可。看看 http://www.gzip.org/zlib/rfc-gzip.html(源格式)和 http://www.pkware.com/documents/casestudies/APPNOTE.TXT。 (2认同)
  • 这里的许多评论都是关于“.zip”文件的。使用 gzip(或 bzip2)算法将多个文件放在一个压缩档案中的标准方法是使用 tar:`tar` 将文件放在一起(未压缩)并保留文件名和属性,gzip 的工作是压缩结果。这甚至可以使用 `tar` 的 `-z` 选项一步完成。生成的文件扩展名为“.tar.gz”或“.tgz”。如果您想将已经压缩的 .gz 文件放在一起,只需使用 tar。它不会对已经压缩的文件进行任何进一步的压缩。 (2认同)
  • @ alvas,`zcat`解压缩其输入,以便为您提供扩展名为`.gz`的解压缩输出。 (2认同)

小智 47

以下是gzip关于您的要求的手册页.

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

gzip -c file1  > foo.gz
gzip -c file2 >> foo.gz
Run Code Online (Sandbox Code Playgroud)

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

你必须注意到这一点."gunzip将立即提取所有成员".

因此,要单独获得所有成员,您将不得不使用额外的东西或写,如果您希望这样做:)

但是,这也在手册页中提到.

"如果你想创建一个包含多个成员的存档文件,以便以后可以独立提取成员,请使用tar或zip等存档.GNU tar支持-z选项以透明方式调用gzip.gzip被设计为补充焦油,不是替代品."

HTH


mat*_*tiu 13

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

cat *gz > final
mv final final.gz
Run Code Online (Sandbox Code Playgroud)

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

zcat final.gz
Run Code Online (Sandbox Code Playgroud)

我尝试了'gz -c'的另一个答案但是当我使用已经gzipped文件作为输入时我最终得到了垃圾(我猜它是双重压缩它们).

PV:

更好的是,如果你有它,'pv'而不是cat:

pv *gz > final
mv final final.gz
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个进度条,但它与cat相同.


Dro*_*ona 11

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

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要gzip新的tar文件?它已经压缩了(除了tar的元数据,它应该很小). (8认同)
  • 额外的 gzip 只会减慢对内容的访问速度。在我看来,OP 要求实际上是生成的存档是单个文件,并且没有理由假设生成的文件应该是 gzip 文件。 (3认同)
  • 你是对的.文件大小没有太大差别,无论你是否因为单个文件已被gzip而gzip它.这只是因为他想要从三个单独的文件中获取gzip文件. (2认同)