2012-12-01 20:47:48 +0000 2012-12-01 20:47:48 +0000
67
67

.tar.gzで最大圧縮を得るには?

私が理解しているtar + gzipの使い方は、通常tarはファイルのグループを一つのファイルにまとめるために使われ、その後gzipはそのファイルを圧縮するために使われるというものです。

tarも圧縮できることを最近知りました。

私は圧縮がどのように機能するのかを完全に理解していないので、圧縮前の.tarをgzipに送ることで、gzipがその可能性があるのと同様に圧縮できなくなるのではないか、という(おそらく馬鹿げた)懸念を持っています。

私の質問は本質的には 絶対最小の tar.gz を作成するためには、どのような引数と圧縮方法の組み合わせを使用すればよいのでしょうか?

回答 (4)

118
118
118
2013-01-31 18:55:22 +0000

あるいは、tar にユーザの最大圧縮率を次のように指定することもできます。

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

さらに、envvars を乱雑にしないようにするには、次のようにします。

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
44
44
44
2012-12-02 03:37:18 +0000

tarはそれだけでは常にデータを圧縮しているわけではありません。

z オプションと一緒に使用した場合にのみ圧縮されます。これも単独ではなく、 - tar化されたデータをgzipに通すことで行われる。

ただし、代わりに この の回答にあるように、2つのコマンドをパイプでつなぐことができます。targzip の2つのコマンドをパイプして、gzip コマンドの圧縮レベルを明示的に指定して出力サイズを最小にすることができます。

tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

ここで、9 は最大圧縮レベルを指定します。

17
17
17
2014-03-10 15:23:08 +0000

通常、gzip も tar も「絶対最小の tar.gz」を作成することはできません。gz形式に圧縮できる圧縮ユーティリティはたくさんあります。私は、最小のファイルを得るために gzip, 7z, advdef, advdef を試すための bash スクリプト gz99 を書きました。これを使って最小のファイルを作成するために実行します。

tar c path/to/data | gz99 file.gz

AdvanceCOMP の gz99 ユーティリティは、通常、最小のファイルを取得しますが、バグがあります(advdef ユーティリティは、advdef の出力を受け入れる前に、ファイルが破損していないかどうかをチェックします)。0x6& を直接使うには、好きなように file.tar.gz を作成してください。それから実行してください。

advdef -z -4 file.tar.gz

これで標準の gz ファイルが作成され、通常通り gzip や tar で読み込めるようになります。これが gz 形式でできる最善の方法です。

あなたは最近 tar が圧縮できることを知ったばかりで、なぜ最小の “.tar.gz” ファイルが欲しいのかを言わなかったので、tar ファイルには xz のようなより効率的なフォーマットがあることに気づいていないかもしれません。一般的に、異なるフォーマットに切り替えることで、gzip オプションをいじくりまわすよりも圧縮率が大幅に向上します。xz の主な欠点は、gzip のように一般的ではないので、ファイルを送る相手が新しいパッケージをインストールしなければならないかもしれないことです。また、特に圧縮時には少し遅くなる傾向があります。もしこれが問題ではなく、本当に最小の tar ファイルが欲しいのであれば、試してみてください。

tar cv path/to/data | xz -9 > file.tar.xz
tar xvf file.tar.xz

最近のバージョンのtarは、例えばUbuntu 13.10では、圧縮ファイルを自動的に検出します。

utility cpu format size(bytes)
gzip -9 0.02s gz 105,628
advdef -2 0.07s gz 102,619
7z -mx=9 -tgzip 0.42s gz 102,297
advdef -3 0.55s gz 102,290
advdef -4 0.75s gz 101,956
xz -9 0.03s xz 91,064
xz -3e 0.15s xz 90,996

これらの圧縮ユーティリティの比較を簡単に説明するために、linuxカーネルのpatch-3.1.1を圧縮した場合の効果を考えてみましょう。

0x1&

この些細な例では、最小の gz を得るために advdef が必要であることがわかります (ただし、7z -tgzip はほぼ同等でバグも少ないです)。また、xz に切り替えた方が、圧縮に時間をかけずに古い gz 形式を最大限に活用するよりも、はるかに多くのスペースを確保できることがわかります。

6
6
6
2014-02-06 18:25:54 +0000
tar c /path/to/data | gzip --best > file.tar.gz

gzip オプション --best (-9に相当) は、最高の圧縮レベルを要求します。