私は何千もの.tbzアーカイブファイルを更新する方法を探しているので、これにはシェルスクリプトを使用します。各ファイルにファイルを追加する必要があります。
私の質問は、各tbzの内容を抽出し、埋め込みtarに含まれている新しいファイルに再圧縮せずにこれを行うより速い方法はありますか?命令はどんな姿なのでしょうか?
ありがとう
答え1
tar
既存のアーカイブにファイルを追加できますが、圧縮することはできません。bunzip2
標準のターボールを残してアーカイブを圧縮する必要があります。その後、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.
答え2
もう一つの答えそうですね。解凍しないと、圧縮された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も同様)。 - 追加されたtarを使用すると、
cat
有効なtarファイルは生成されません。これが--concatenate
このオプションが存在する理由です。しかし、tarに有効なふりをするように頼むことができます。
この操作を使用する代わりに、catを使用して2つのアーカイブを結合したいと思うか、またはより直感的に見えるかもしれません。
--concatenate
結局のところ、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
上記の方法では、元の両方のアーカイブの3つのファイルを一覧表示しますが、最初の元の-i
アーカイブのファイルだけを(正しく)一覧表示せずに一覧表示する方法に注意してください。
$ tar tf combined.tar.bz2
a
b
繰り返しますが、これは汚いトリックにすぎませんが、-i
書き込みと読み取りの両方の側面を制御し、この方法で生成されたファイルを読み取ろうとするときに使用されることを確認できれば便利です。