web-dev-qa-db-ja.com

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

Gzipファイルのリストがあります。

file1.gz
file2.gz
file3.gz

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

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

77
neversaint

Gzipファイルを使用すると、ファイルを単純に連結できます。 gzip RFC

Gzipファイルは、一連の「メンバー」(圧縮データセット)で構成されています。 [...]メンバーはファイル内に次々に表示されるだけで、メンバーの前、間に、または後に追加情報はありません。

これは、連結されたデータの単一のgzipファイルを作成することとまったく同じではないことに注意してください。とりわけ、元のファイル名はすべて保持されます。ただし、gunzipは連結と同等に処理するようです。

既存のツールは通常、追加メンバーのファイル名ヘッダーを無視するため、結果から個々のファイルを抽出することは簡単にできません。これを可能にしたい場合は、代わりにZipファイルを作成します。 ZipとGZIPは両方とも、実際の圧縮にDEFLATEアルゴリズムを使用します(Zipは他のいくつかの圧縮アルゴリズムとオプションをサポートしています-方法8はGZIPの圧縮に対応しています)。違いはメタデータ形式です。メタデータは圧縮されていないため、gzipヘッダーを取り除き、Zipファイルヘッダーと中央ディレクトリレコードを代わりに追加するのは簡単です。 gzip形式の仕様 および Zip形式の仕様 を参照してください。

85
bdonlan

man 1 gzipがあなたの要件について言っていることは次のとおりです。

複数の圧縮ファイルを連結できます。この場合、gunzipはすべてのメンバーを一度に抽出します。例えば:

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

それから

gunzip -c foo

に等しい

cat file1 file2

言うまでもなく、file1file1.gzに置き換えることができます。

これに注意する必要があります:

gunzipは一度にすべてのメンバーを抽出します

そのため、すべてのメンバーを個別に取得するには、追加の何かを使用するか、書き込みを行う必要があります。

ただし、これはmanページでも対処されています。

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

46
Nehal Dattani

猫を使うだけです。非常に高速です(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

これにより、進行状況バーが機能しますが、catと同じことを行います。

13
matiu

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

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