tbzファイルへのファイルの追加


8

何千もの.tbzアーカイブファイルを更新する方法を探しているので、これをシェルスクリプトで実行します。それぞれに1つのファイルを追加する必要があります。

私の質問は、各tbzの内容を抽出せずに、含まれているtarに含まれている新しいファイルで再圧縮することなく、これを行うより速い方法はありますか?コマンドはどのように見えますか?

ありがとう


明白な代替策は、圧縮ファイルを非圧縮tarballに入れることです。しかし、これはデータ形式を変更するため、実行できない可能性があり、それらの間に冗長性がある小さなファイルが多数ある場合は非効率になる可能性があります。
2018

回答:


12

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.

それは確かに本当です
Kiwy

これは1つの方法ですが、唯一の方法ではありません。完全に解凍せずにbzip2ストリームを変更することが可能です。tarアーカイブにきれいに追加できる方法でそれが可能かどうかはわかりませんが、dhagは部分的な方法を示しています。
Gilles「SO-悪をやめる」

10

もう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

ただし、解凍を必要としないダーティな作業の種類のソリューションに関心がある場合は、次の観察に基づいてソリューションを提供できます。

  • を使用したbzip2ストリームの追加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、この方法で作成されたファイルから読み取ろうとするときにそれが使用されることを確認できると便利です。


細かい対応に大変感謝しています。残念ながら、私は最終的にこれらのアーカイブを読み取るプロセスを制御できません。
BottleZero 2018

これを使用すると、アーカイブ内の一部のファイルを「非表示」にできるため、何気なく抽出しても元のtarballのコンテンツしか取得できませんiが、コマンドラインにを追加することを知っている人にはすべてが表示されます。
モンティハーダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.