たとえば、
$ll test
a1
a2
というtestディレクトリに対して、
$tar cvfz test.tar.gz test
とする方法と同等の操作をtarに追記する形などで実現したいと思っています。
ちなみに以下の方法ではだめでした。
$gzip a1 a2
$ll
a1.gz
a2.gz
$mkdir test
$tar cvfz test.tar.gz test
$tar rf test.tar.gz a1.gz
tar: 圧縮されたアーカイブはアップデートできません
質問の意図は、時間制限が厳しい状況で早くtar.gzを作りたいと考えているからです。
1台のサーバで複数コアを使った圧縮ではpigzというコマンドを使って
$ tar -c test | pigz > test.tar.gz
という例はありましたが、複数台のサーバを平行処理する方法が無いかも探しております。
仮に上の方法でやれたとすると、圧縮処理だけは各サーバでやらせるとかできますので・・・
最終的に tar.gz の形にせずに、tar のままにする、というのはナシですか?
tar.gz の形はしょせん、tar 形式のファイルを gzip で圧縮する、なので、何かを追加しようとすると、
とせざるを得ません。
zcat 後に tar で追加して gzip で圧縮、と考えたのですが、手元で軽く試した感じだと、zcat の標準出力を tar の標準入力に入れて r でファイルを追加、とすると、「r の時は、標準入力はダメ」と怒られました。
一時ファイルを作れば不可能では無いですが、それだと、前述の手順を単にシェルスクリプト化するだけになってしまいます。
で、ふと思ったのですが、
質問の意図は、時間制限が厳しい状況で早くtar.gzを作りたいと考えているからです。
という事であれば、複数の tar.gz のファイルが含まれている tar ファイルを作る、とすれば、r で新たな tar.gz ファイルを追加する、というのは可能です。
「圧縮済みのファイルを固めた tar ファイル」と「固めた tar ファイルを圧縮したファイル」のとでは、圧縮率は前者の方が不利ですが、手元で試した感じだと、1 % 程度の違いでした。
もし、圧縮率もシビアに考えるなら、gzip の代わりに bzip2 とか 7z に変える方が、先述の「tar で止める」ことによる増分を気にするより効果的だと思います。
回答ありがとうございます。
2014/11/09 09:20:54上の回答から自分も一つ思いついたことがありますが・・・後で試してみようかなと思います。
純粋?なtar.gzである必要については今のところ仕様ですので(変更もできるような気はしますが、できないと言ってから変えたい)
できあがったものでそれぞれハッシュ取ったときに違いが無いものができあがるのが要望です。