すでに出来上がっているtarファイルに圧縮(gzip)ファイルを追記するやり方で最終的にtar.gzと同じファイルが出来上がる方法はありますでしょうか?linux(CentOS6系)でです。

たとえば、
$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
という例はありましたが、複数台のサーバを平行処理する方法が無いかも探しております。
仮に上の方法でやれたとすると、圧縮処理だけは各サーバでやらせるとかできますので・・・

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2014/11/16 02:30:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント200pt

最終的に tar.gz の形にせずに、tar のままにする、というのはナシですか?

tar.gz の形はしょせん、tar 形式のファイルを gzip で圧縮する、なので、何かを追加しようとすると、

  1. gzip で圧縮されている内容を展開する。
  2. 展開して得られた tar ファイルにファイル等を追加する。
  3. 追加後の tar ファイルを gzip で圧縮する。

とせざるを得ません。

zcat 後に tar で追加して gzip で圧縮、と考えたのですが、手元で軽く試した感じだと、zcat の標準出力を tar の標準入力に入れて r でファイルを追加、とすると、「r の時は、標準入力はダメ」と怒られました。

一時ファイルを作れば不可能では無いですが、それだと、前述の手順を単にシェルスクリプト化するだけになってしまいます。

で、ふと思ったのですが、

質問の意図は、時間制限が厳しい状況で早くtar.gzを作りたいと考えているからです。

という事であれば、複数の tar.gz のファイルが含まれている tar ファイルを作る、とすれば、r で新たな tar.gz ファイルを追加する、というのは可能です。

「圧縮済みのファイルを固めた tar ファイル」と「固めた tar ファイルを圧縮したファイル」のとでは、圧縮率は前者の方が不利ですが、手元で試した感じだと、1 % 程度の違いでした。

もし、圧縮率もシビアに考えるなら、gzip の代わりに bzip2 とか 7z に変える方が、先述の「tar で止める」ことによる増分を気にするより効果的だと思います。

id:dethanc

回答ありがとうございます。
上の回答から自分も一つ思いついたことがありますが・・・後で試してみようかなと思います。

純粋?なtar.gzである必要については今のところ仕様ですので(変更もできるような気はしますが、できないと言ってから変えたい)
できあがったものでそれぞれハッシュ取ったときに違いが無いものができあがるのが要望です。

2014/11/09 09:20:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません