tar -zcvfを使用するときに圧縮レベルを指定する方法は?


142

私は非常に頻繁に仕事でディレクトリをgzipします。私が普段していることは

tar -zcvf file.tar.gz /path/to/directory

ここで圧縮レベルを指定する方法はありますか?圧縮に時間がかかる場合でも、可能な限り最高の圧縮を使用したいと思います。

回答:


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

bashを使用していると仮定します。通常、GZIP環境変数を「-9」に設定し、tarを通常どおり実行します。

また、本当に最高の圧縮が必要な場合は、gzipを使用しないでください。lzmaまたは7zを使用します。

また、gzipを使用する場合(とにかくさまざまな理由で良い考えです)pigz、ではなくプログラムの使用を検討してくださいgzip


14
pigzは、gzip圧縮にすべてのコアを使用する「パラレルgzip」です。top200%-400 $ CPUの間のどこでも使用して見ることができます。
フェリペアルバレス

2
FYI、.bz2形式、使用のために:BZIP2 = -9タールcvjf file.tar.bz2 /パス/に/ディレクトリ
智史

3
環境変数はのようになりGZIP_OPT、使用方法は同じになります。
シアー

3
gzipのUbuntu 16.04のマニュアルページから:「プログラムの呼び出し用に設定されたシンボルとの競合を避けるため、Vax / VMSでは、環境変数の名前はGZIP_OPTです。」sh、csh、およびMSDOSの場合は、GZIPのままにする必要があります
-Ponyboy47

68

tarにgzipフラグを使用する代わりに、tarプロセスの後にファイルを手動でgzipし、gzipプログラムの圧縮レベルを指定できます。

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

または、次を使用できます。

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

gzipコマンドラインの-9は、gzipに可能な最大圧縮レベル(デフォルトは-6)を使用するように指示します。

編集: @depeszコメントに基づいてパイプコマンドラインを修正しました。


4
パイプの使用は次のようにしてくださいtar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
「.gz」拡張子が追加されるためfile.tar、最初の例はで終わる必要がありgzipます。
盆栽バイキング

4
どうしてスキップしないのf -?ファイルがない場合は、stdin / out
akostadinov

前のコメントに加えて。「man tar」セクションから環境:TAPE --fileが指定されていない場合にアーカイブに使用するデバイスまたはファイル。この環境変数が設定されていない場合は、代わりにstdinまたはstdoutを使用してください。
ミクル

2
「gzip -9-」->「gzip -9」を減らすことができます。「man gzip」セクションから説明:ファイルが指定されていない場合、またはファイル名が「-」の場合、標準入力は標準出力に圧縮されます。
ミクル

53

tarの最新バージョンは、xzアーカイブ形式をサポートしています(GNU tar、2009年の1.22 以降、Busyboxは2010年の1.17.0 以降)。

これは、gzの7-Zipバージョンのようなlzma2に基づいています。これにより、xzサポートを必要とする要件を満たしていれば、より良い圧縮が得られます。

tar -Jcvf file.tar.xz /path/to/directory

私はここで(基本的にこの質問のduですが、Unixスタック交換で)、他の投稿のGZIPと同様にXZ圧縮レベルを制御するXZ_OPT = -9環境変数があることを発見しました。

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xzはbzip2とgzipの両方よりもはるかに優れています。比較は次のとおり
User1

8
トレードオフは速度です。XZは大幅に低速です。
ベル

32
tar cv /path/to/directory | gzip --best > file.tar.gz

これはMatrix Moleの2番目のソリューションですが、わずかに短縮されています。

tarを呼び出すと、オプションfは出力がファイルであることを示します。これを-(stdout)に設定すると、tarは出力をstdoutに書き込みます。stdoutは、fとの両方がないデフォルトの動作です-

また、gzipマニュアルページで述べられているように、ファイルが指定されていない場合、gzipは標準入力から圧縮します。以下のための必要はありません-でのgzip通話が。

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


1
これは美しく機能します。また、rootとして実行する場合、権限と所有者も保持されます。それ以外の場合は指定する必要があります。また、明らかでない場合は、「-9」が最高の圧縮であり、「-1」が最速の圧縮です。多くのファイルがある場合、「-1」はまだ時間がかかります;
PJ Brunet

これは、と連携xzし、pixzあまりにも。中間の.tarファイルを作成せずに、並列圧縮に使用されるスレッドの数を制御するのに最適な方法です。そうですtar -cv /path/to/dir | pixz -p4 > output.tpxz
-joelostblom

10

-Iを使用して圧縮プログラムを指定するオプションもあります。これには、圧縮レベルオプションを含めることができます。

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
CentOS 6および7で提供されているようなtarの古いバージョンは、引数での-I引数の提供をサポートしていません。それらは、実行するプログラム名として全体を処理しようとするため、失敗します。少なくともDebian Stretchのtar 1.29の時点では、これは機能します。
チーター

2

そしてもちろん、macOS bsdから派生したtarは異なっていなければなりません:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.