多くの圧縮ファイルを1つのアーカイブに結合するにはどうすればよいですか?


10

.tar.xzほぼ同一の数百のファイルがあります(これらは毎日のデータベースダンプであり、データベースの変更はゆっくりです)。

非圧縮ファイルは類似しているため、非常によく圧縮され、小規模なテストでは、これらの非圧縮ファイルをいくつ圧縮しても、そのうちの1つよりもわずかに大きいアーカイブしか作成されないことがわかっています。

私の問題は、すべての非圧縮ファイルが数テラバイト(圧縮比は約25:1)になることであり、作業領域として使用するほどのディスク領域がありません。

個々の圧縮ファイルを一度に1つずつ処理して、それらを単一のアーカイブに追加し、それらを一緒に圧縮する利点を維持する方法はありますか?


スクリプトを作成して、1つのファイルを解凍し、すべてのファイルを特定のアーカイブに追加してから、次のアーカイブに移動したことはありますか?
darnir 2014

回答:


10

tarファイルはストリーミング形式catであるため、2つを組み合わせるとほぼ正しい結果が得られます。これを行うためにファイルをディスクに抽出する必要はまったくありません。ファイルを(のみ)解凍し、それらを連結して、そのストリームを再圧縮できます。

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzほんの少し破損しているコンポーネントtarballs内のすべてのファイルの圧縮tarballになります。アーカイブには、結果の中央に表示される「ファイルの終わり」マーカーがあるため、抽出するには、--ignore-zerosオプション(GNUの場合tar)を使用する必要があります。それ以外は、すべてが正しく動作します。

GNU tarは、--concatenate結合アーカイブを作成するためのモードもサポートしています。これには上記と同じ制限があります--ignore-zeros—抽出には使用する必要があります—しかし、圧縮アーカイブでは機能しません。プロセス置換を使用して、それをだまして動作させるために何かを構築することができますが、それは面倒でさらに壊れやすいものです。

異なるtarファイルに複数回出現するファイルがある場合、これは正しく機能しませんが、問題はあります。そうでなければ、これはあなたが望むものをあなたに与えます—出力をパイプすることxztarとにかく出力をどのように圧縮するかです。


特定のtar実装でのみ機能するアーカイブが目的に適さない場合、アーカイブに追加するのrはあなたの友人です:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

これは一度に1つのアーカイブのみを抽出するため、作業スペースは1つのアーカイブのコンテンツのサイズに制限されます。圧縮は、最終的なアーカイブを一度に作成した場合とまったく同じようにストリーミングされるため、これまでにないほど優れたものになります。過剰な解凍と再圧縮をたくさん行うと、catバージョンよりも遅くなりますが、結果のアーカイブは特別なサポートがなくてもどこでも機能します。

正確に何をしたいかに応じて、圧縮されていないtarファイル自体をアーカイブに追加するだけで十分な場合があることに注意してください。それらは単一ファイルの内容と同様に(ほぼ)正確に圧縮し、各ファイルの圧縮オーバーヘッドを削減します。これは次のようになります。

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

これは、ストリームに余分なtarヘッダーがあるため、最終的な圧縮サイズの点で効率が少し低下しますが、すべてのファイルをファイルとして抽出および再追加する時間を節約できます。combined.tar.xz多くの(非圧縮)db-*.tarファイルが含まれることになります。


おかげで、2番目のオプションは私の目的に合っているように見えますが、最後の段落について詳しく説明してもらえますか?これはどのように見えますか?
jl6 2014

@ jl6:編集を参照してください。
Michael Homer

申し訳ありませんが、これをテストすることしかできませんでした。あなたの第二の方法は、私は、このエラーを与える:tar: Cannot update compressed archives
jl6
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.