.tar.gzで最大の圧縮を取得する方法は?[複製]


63

この質問にはすでに答えがあります:

tar + gzipの使用を理解する方法tarは、通常、ファイルのグループを単一のファイルに統合するgzipために使用され、そのファイルを圧縮するために使用されます。

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

コアの圧縮がどのように機能するかを完全には理解していないため、事前に圧縮された.tarをgzipに送信すると、gzipの圧縮が妨げられる可能性があり、その可能性やその性質が懸念される(おそらくばかげている)。

私の質問は本質的に:絶対最小のtar.gzを作成するために使用するargs / compressionメソッドの組み合わせと、そのためのコマンドラインステートメントはどのように見えますか?


2
すでに圧縮されているファイルを圧縮すると、サイズが小さくなったり、アーカイブが大きくなる場合があります。それはすべて、データの種類と使用されている圧縮に依存します。
ケルタリ

@Keltariが言ったこと。圧縮率と圧縮率は、圧縮する内容に大きく依存します。これは、異なる圧縮アルゴリズムと方法がある理由でもあります。
music2myear 14年

回答:


111

または、この方法でtarにユーザーの最大圧縮を指示できます。

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

さらに、envvarsを整理しておくには、次のようにします。

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

43

あなたが述べたように、「tarは圧縮することできます」は、データを常にそれ自体で圧縮するとtar限りません。

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

しかしその代わり、などに注意し、この答えは、あなたパイプできる2つのコマンド:targzip明示的の圧縮レベルを指定することができるように、gzip最小の出力サイズを達成するためのコマンドを。

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

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


コマンドが分割されているため、再帰的ではなく、空のアーカイブになると文句を言う問題がありました。すでにtarがデフォルトであるため、再帰を適切に強制する方法を見つけるのは困難です。私の悪い、私はこのように間違って指定していたtar -cvf /path
ブライアントーマス

17

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

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

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

advdef -z -4 file.tar.gz

これにより、gzipとtarで通常どおり読み取ることができる標準のgzファイルが作成され、ほんの少し小さくなります。これは、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カーネルからパッチ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形式を最大限に活用しようとするよりもはるかに多くのスペースが得られることがわかります。


OPは、.tar.gzファイルを最大限に圧縮する方法を求めましたが、.tar.xzファイルを作成することを提案しました。質問とは異なる質問に答えています。
ChrisInEdmonton 14年

ああ、あなたが何をしようとしているのかわかります。advdefは私のシステム(v1.15)でクラッシュするだけなので、「advdef -z -4 file.tar.gz」は機能しませんが、少なくとも理論的には機能します。「gzip -9」よりもさらにファイルを圧縮するという証拠は見つかりませんが、そうなる可能性があり、いずれにしても、-1票を削除するのに十分です。明確にしてくれてありがとう!
ChrisInEdmonton 14年

うーん、私はv1.17を使用しています。とにかく、私の学問的な数学者は、私の答えが間違いなく技術的に正しくないことを指摘したいと思います。結局のところ、すべての可能なgzファイルを最短から最長まで列挙し、適切なファイルに解凍する最初のファイルを選択すると、さらに数バイト削ることができます。しかし、それは実際には遅すぎるでしょう。
gmatht

「バギー」と「アーカイブ」を一緒に使用する必要はないと思いますが、破損したアーカイブはどのような用途ですか?あなたは必要とする多くの第二の相違点の1/100測定することは、私が思うに、その信頼性は高くありません-あまりにも圧縮ユーティリティ、および入力ファイルの種類を「比較」への大きなファイルをxz -9通常5倍のようなものを取るgz -9時間は、だけでなく、1.5倍などあなたのテーブルが示唆しています。
Xen2050

xzプロセスを使用して(圧縮中に)分割アーカイブを作成するにはどうすればよいですか
-nyxee

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

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


4
または、--bestフラグを使用します。-9は読者を混乱させます。
om-nom-nom 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.