2011-07-01 18:00:22 +0000 2011-07-01 18:00:22 +0000
149
149

tar -zcvfで圧縮レベルを指定するには?

仕事でよくディレクトリをgzipします。普段やっているのは

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

ここで圧縮レベルを指定する方法はないのでしょうか?圧縮に時間がかかってもできるだけ最適な圧縮を使いたいのですが、何か方法はありますか?

回答 (5)

69
69
69
2011-07-01 18:25:45 +0000

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 のコメントに基づいてパイプコマンドラインを修正しました。

55
55
55
2012-12-19 03:03:43 +0000

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

これは lzma2 をベースにしており、 gz 7-Zip バージョンのようなものです。xzのサポートが必要な要件を満たしていれば、これはより良い圧縮を提供します。

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

私はちょうど ここ (基本的にはこの質問のダミーですが、Unix stackexchangeにあります) で、他の投稿にあるGZIPのものと同様に、XZ圧縮レベルを制御するための環境変数XZ_OPT=-9があることを知りました。

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
34
34
34
2013-02-04 18:17:32 +0000
tar cv /path/to/directory | gzip --best > file.tar.gz

これはMatrix Moleの2番目の解決策ですが、少し短くなっています。

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

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

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

10
10
10
2016-06-21 04:21:54 +0000

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

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
3
3
3
2019-01-19 16:26:40 +0000

そしてもちろん、macOS の bsd 由来の tar は、

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
```というように異なるものでなければなりません。

関連する質問

6
10
5
37
7