複数のGZipファイルの高速連結


92

gzipファイルのリストがあります:

file1.gz
file2.gz
file3.gz

これらのファイルを解凍せずに1つのgzipファイルに連結またはgzip圧縮する方法はあり ますか?

実際には、これをWebデータベース(CGI)で使用します。Webがユーザーからクエリを受信し、クエリに基づいてすべてのファイルを一覧表示し、バッチファイルでユーザーに提示する場所。

回答:


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 2011年

1
技術的に言えば、それらは保存されます。一般に、既存のツールにはそれらを個別に抽出する機能がないというだけです。ZIPヘッダーとディレクトリの構築を検討することをお勧めします。ZIP形式は同じ基本的な圧縮アルゴリズムを使用するため、(非圧縮の)メタデータを変更するだけです。見てみましょうgzip.org/zlib/rfc-gzip.html(ソース形式)とpkware.com/documents/casestudies/APPNOTE.TXT
bdonlan 2011年

20
gzファイルのzipを作成するよりも、タールを塗るだけです。cat答えと同じですが、メタデータがいくつか追加されています。後でそれらを解凍して元のファイル名を取得し、必要に応じてすべてまたは一部を解凍できます。
sorpigal 2011年

1
ここでの多くのコメントは.zipファイルに関するものです。アルゴリズムgzip(またはbzip2)を使用して複数のファイルを1つの圧縮アーカイブにまとめる標準的な方法は、tarを使用tarすることです。ファイルをまとめ(非圧縮)し、ファイル名と属性を保持します。gzipの仕事は結果を圧縮することです。これは、の-zオプションを使用して1つのステップで実行することもできますtar。結果のファイル拡張子は.tar.gzまたは.tgzです。すでに圧縮された.gzファイルをまとめたい場合は、tarを使用してください。すでに圧縮されているファイルに意味のあるそれ以上の圧縮は行いません。
ダニエルアルダー2014年

2
@alvasはzcat、入力を解凍します。これにより、.gz拡張子が付いた解凍された出力が得られます。
bdonlan 2015

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はすべてのメンバーを一度に抽出します

したがって、すべてのメンバーを個別に取得するには、追加の何かを使用するか、必要に応じて書き込む必要があります。

ただし、これはmanページでも取り上げられています。

複数のメンバーを含む単一のアーカイブファイルを作成して、後でメンバーを個別に抽出できるようにする場合は、tarやzipなどのアーカイバを使用します。GNU tarは、-zgzipを透過的に呼び出すオプションをサポートしています。gzipは、tarの代わりとしてではなく、tarを補完するものとして設計されています。


13

猫を使うだけ。非常に高速です(私にとっては500 MBで0.2秒)

cat *gz > final
mv final final.gz

次に、zcatを使用して出力を読み取り、きれいであることを確認できます。

zcat final.gz

'gz -c'の他の答えを試しましたが、すでにgzip圧縮されたファイルを入力として使用するとゴミが出てしまいました(二重に圧縮されていると思います)。

PV:

さらに良いことに、あなたがそれを持っているなら、猫の代わりに「pv」:

pv *gz > final
mv final final.gz

これにより、プログレスバーが機能しますが、猫と同じように機能します。


11

これらのファイルのtarファイルを作成してから、tarファイルをgzipで圧縮して新しいgzipファイルを作成できます。

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

8
新しいtarファイルを正確にgzipで圧縮する必要があるのはなぜですか?すでに圧縮されています(tarのメタデータは別として、小さいはずです)。
thiton 2011年

2
あなたが正しいです。個々のファイルはすでにgzipで圧縮されているため、gzipで圧縮してもファイルサイズに大きな違いはありません。それは、彼が3つの個別のファイルからgzipファイルを作成したかったからです。
ドロナ2011年

1
余分なgzipは、コンテンツへのアクセスを遅くするだけで、利益はありません。OPの要件は、実際には結果のアーカイブが単一のファイルであるということであり、結果のファイルがgzipファイルであると想定する理由はないように思われます。
mc0e 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.