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