何千もの.tbzアーカイブファイルを更新する方法を探しているので、これをシェルスクリプトで実行します。それぞれに1つのファイルを追加する必要があります。
私の質問は、各tbzの内容を抽出せずに、含まれているtarに含まれている新しいファイルで再圧縮することなく、これを行うより速い方法はありますか?コマンドはどのように見えますか?
ありがとう
何千もの.tbzアーカイブファイルを更新する方法を探しているので、これをシェルスクリプトで実行します。それぞれに1つのファイルを追加する必要があります。
私の質問は、各tbzの内容を抽出せずに、含まれているtarに含まれている新しいファイルで再圧縮することなく、これを行うより速い方法はありますか?コマンドはどのように見えますか?
ありがとう
回答:
は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ストリームを生成します(gzipについても同じです)。cat
してtar を追加しても、有効なtarファイルは生成されません。そのため、この--concatenate
オプションが存在しますが、tarが有効であるように見せかけることができます。
--concatenate
操作を使用する代わりに、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
上記の例では、元の2つのアーカイブの3つのファイルすべてがリストされていますが、省略-i
(正しく)すると、最初の元のアーカイブのファイルのみがリストされます。
$ tar tf combined.tar.bz2
a
b
繰り返しになりますが、これはダーティトリックにすぎませんが、書き込み側と読み取り側の両方を制御し-i
、この方法で作成されたファイルから読み取ろうとするときにそれが使用されることを確認できると便利です。
i
が、コマンドラインにを追加することを知っている人にはすべてが表示されます。