web-dev-qa-db-ja.com

.tar.gzで最大の圧縮率を得るにはどうすればいいですか?

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

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

圧縮がどのように機能するのか完全には理解できていないので、gzipに圧縮済みの.tarを送信するとgzipが圧縮できなくなる可能性があり、そのようなことが起こる可能性があります。

私の質問は本質的に:私は絶対最小のtar.gzを作成するためにどのようなargs/compression方法の組み合わせを使うべきですか、そしてそのためのコマンドラインステートメントはどんなものですか?

55
Mario Zigliotto

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

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

さらに、環境を雑然としないようにするには、次のようにします。

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
103
Brian Fane

" tarはcompress "と言うことができますが、これは - tar 常に - それ自体でデータを圧縮することを意味するのではありません。

zオプションと一緒に使用した場合にのみそうなります。それ自体もそうではありませんが、 - tarされたデータをgzipに渡すことによってです。

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

tar cvf - /path/to /ディレクトリ| gzip -9 - > file.tar.gz

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

40
Ujjwal Singh

通常gzipもtarも "絶対最小のtar.gz"を作成することはできません。 gz形式に圧縮できる圧縮ユーティリティはたくさんあります。最小のファイルを取得するためにgzip7zおよびadvdefを試すbashスクリプト「 gz99 」を書きました。これを使用して最小のファイルを作成するには、次のコマンドを実行します。

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

AdvanceCOMPのadvdefユーティリティは通常最小のファイルを提供しますが、これもバグです(gz99ユーティリティはadvdefの出力を受け入れる前にファイルが破損していないことを確認します)。 advdefを直接使用するには、file.tar.gzを作成してください。次に実行します。

advdef -z -4 file.tar.gz

これは標準のgzファイルを作成し、それは普通のgzipとtarで読むことができます。これはあなたがgzフォーマットでできる最善のことです。

Tarが圧縮できることを最近学んだだけで、最小の ".tar.gz"ファイルが必要な理由を述べなかったので、xzのようなより効率的なフォーマットがtarファイルで使用できることに気付かないかもしれません。一般的に、別のフォーマットに切り替えると、gzipオプションをいじるよりも圧縮率が大幅に向上します。 xzの主なデメリットはgzipほど一般的ではないので、ファイルを送る人は新しいパッケージをインストールしなければならないかもしれないということです。特に圧縮時には、少し遅くなる傾向があります。これが問題にならない、そしてあなたが本当に最小のtarファイルが欲しいなら、試してみてください。

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

Ubuntu 13.10などの最新バージョンのtarは、自動的に圧縮ファイルを検出します。そのため、xz圧縮を使用しても、通常どおり解凍できます。

 tar xvf file.tar.xz

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

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

この些細な例では、最小のgzを取得するにはadvdefが必要です(7z -tgzipの場合とほぼ同じくらい良く、バグが少なくなります)。また、xzへの切り替えは、圧縮に時間がかかりすぎることなく、古いgz形式を最大限に活用しようとするよりもはるかに多くのスペースを得ることがわかります。

14
gmatht
tar c /path/to/data | gzip --best > file.tar.gz

gzipオプション--best-9と同等)は最高の圧縮レベルを要求します。

6
carlito