tar
の間 既存のアーカイブにファイルを追加できますが、圧縮することはできません。 bunzip2
する必要があります 圧縮されたアーカイブで、標準の tarball が残ります。その後、 tar
を使用できます ファイルを既存のアーカイブに追加し、bzip2
で再圧縮する機能 .
マニュアルから:
-r Like -c, but new entries are appended to the archive. Note that this only
works on uncompressed archives stored in regular files. The -f option is
required.
もう 1 つの答えは正しいです。圧縮された tar アーカイブを解凍しないと、適切に更新することはできません。 GNU tar ドキュメントはそれを示唆しており、更新しようとすると明示的なエラー メッセージが表示されて失敗します:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now
ただし 解凍を必要としない、ちょっとした作業のようなソリューションに興味がある場合は、次の観察に基づいて提供できます:
cat
を使用して bzip2 ストリームを追加する サポートされており、有効な bzip2 ストリームを生成します (gzip についても同様です);cat
を使用して tar を追加する 有効な tar ファイルを生成しないため、--concatenate
オプションは存在しますが、tar に有効なふりをさせることができます:
--concatenate
を使用する代わりに、cat を使用して 2 つのアーカイブを連結したい、または使用しようとする方が直感的に思えるかもしれません。 手術;結局、cat はファイルを結合するためのユーティリティです。
ただし、tar アーカイブには、連結されたアーカイブを 1 つのアーカイブとして適切に読み取る場合に削除する必要があるファイルの終わりマーカーが組み込まれています。 --concatenate
新しい各アーカイブが追加される前に、ターゲット アーカイブからアーカイブの終了マーカーを削除します。 cat を使用してアーカイブを結合すると、結果は有効な tar 形式のアーカイブになりません。 cat ユーティリティを使用して追加されたアーカイブからファイルを取得する必要がある場合は、 --ignore-zeros
を使用します (-i
) オプション。
この知識に基づいて、たとえば次のことができます。
cat {one,two}.tar.bz2 >combined.tar.bz2
上記のドキュメント スニペットで説明されているように、これは無効な tar ファイルになりますが、--ignore-zeros
を使用します。 、まだ完全に読むことができます:
## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b
## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c
## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c
-i
を省略しているのに対し、上記は元の 2 つのアーカイブから 3 つのファイルすべてを一覧表示していることに注意してください。 (正しく) 最初の元のアーカイブからのファイルのみを一覧表示します:
$ tar tf combined.tar.bz2
a
b
繰り返しますが、これは汚いトリックにすぎませんが、書き込み側と読み取り側の両方を制御し、 -i
を確実に制御できる場合に役立ちます。 この方法で作成されたファイルから読み取ろうとするときに使用されます。