最大圧縮を使用してTARでディレクトリをXZする方法は?


116

そのため、ディレクトリを最大圧縮で圧縮する必要があります。

どうすればそれを行うことができxzますか?tarだけではディレクトリを圧縮できないため、私も必要になるでしょうxz。たとえば、生成するonelinerはありfoo.tar.xzますか?


11
FWIW、詳細についてman 1 xzはRTFMは言いit's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1). -7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively.ます。
cychoi

回答:


82

xzコマンドラインフラグの標準セット(圧縮レベルフラグを含む)を尊重すると仮定すると、以下を試すことができます。

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 

そして、これはXZで最大圧縮レベルを使用しますか?
ランスベインズ

3
XZに-9追加することが最大になります
BSD

23
-9eは最高レベルですが、非常に時間がかかります
クシシュトフクラソń16年

-9e常に最良の結果が得られるとは限りません-ここでポイント8を参照してくださいrootusers.com/13-simple-xz-examples
KolonUK

1
また、--threads=0xzに追加すると大幅な改善が見られる場合があります
KolonUK

146

tarbashまたは派生シェルで最近のGNU を使用する場合:

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

tarの小文字のjスイッチはbzipを使用し、大文字のJスイッチはxzを使用します。

XZ_OPT環境変数を使用すると、設定することができますxzよう呼び出すアプリケーションを経由して渡すことができないオプションをtar

これは現在最大です。

参照してください。man xzあなたが設定できるその他のオプションについては(-e/ --extreme かもしれないあなたにいくつかのデータセットのためにいくつかの追加の圧縮の利益を与えます)。

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory

27
いいえ、そうではありません。それが全体のポイントです。その呼び出しだけに環境変数を設定できます。必要に応じてエクスポートできますが、エクスポートする必要はありません。
bsd

2
そのためには、bashのようなシェルを想定しています。
-anddam

7
@ anddam、Bourneファミリーのすべてのシェル(Bourne、ksh、mksh、pdksh、ash、dash、bash、yash、zsh)およびrcandでサポートされていますakangafishcshtcshおよびesそれをサポートしていない主要なシェルです。そこで、envコマンドを使用します。
ステファンシャゼル

1
だから、両方を設定する-9-eXZは付き合えない、あなたは欲しいXZ_OPT=-e9けど@krzykが指摘したように、-eで極端に遅い
ホブ

4
記録のために:XZ_OPTはで実装された機能ではありませんtar。これはの機能ですxz。をtar呼び出すxzと、env-variableが単に渡されます。
スヴェン

14
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

よりも優れています

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

5
これはどうですか?eフラグは何をしますか?
cxdf

2
option -e, --extreme圧縮プリセット(-0 ... -9)を変更して、コンプレッサーまたはデコンプレッサーのメモリ使用量を増やすことなく、少し良い圧縮率を実現できるようにします(例外:プリセット-0 ... -2)。欠点は、圧縮時間が劇的に増加することです(簡単に2倍になります)。
エヴァンドロジュニア

だから、マシンで約80GBのソフトウェアを圧縮する場合(すべてのコンピューターリソースを圧縮プロセスで処理するために高速化する-9場合)-9e、使用しないでください、そうですか?
-nyxee

1
デフォルトでは、XZは1コア/スレッドを使用して、あなたは最高のことを行うには、例えば、-T0を追加することによって、(それをすべてをスピードアップする)ことができますXZ_OPT="-9e -T0" tar -cJf ...
EkriirkE

10

16 GiBのRAMが搭載されている(他に何も実行されていない)場合は、以下を試すことができます。

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 

これには、解凍に1.5 GiB、圧縮に約11倍必要です。それに応じて、メモリ量が少なくなるように調整してください。

データが実際にその大きさ、そしてどのような場合には、それは助けにはなりません場合にのみ役立ちますTHATくらい、まだ...

バイナリを圧縮する場合は、最初のxzオプションとして--x86を追加します。「マルチメディア」ファイル(非圧縮オーディオまたはビットマップ)で遊んでいる場合は、-delta = dist = 2で試すことができます(値を試してみてください。試してみると良い値は1..4です)。

あなたが非常に冒険を感じているなら、あなたはより多くのLZMAオプションで遊んでみることができます

--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2

(これらはデフォルト設定です。0〜4の値を試すことができ、lc + lpは4を超えてはなりません)

デフォルトのプリセットがこれらの値にどのようにマッピングされるかを確認するには、ソースファイルsrc / liblzma / lzma / lzma_encoder_presets.cを確認します。ただし、あまり関心のあるものはありません(-eは長さを273に設定し、深さも調整します)。


6

さまざまなオプションを試すことができます

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

私は実行してテストしました:

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

そのため、オプション-4eは-9eよりも少しうまく機能しているようです。

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2

3
これは本当に質問に答えません。これは、特定の小さなデータセットに対して、-4eが既に最高の圧縮を取得しているため、より高いレベルではそれ以上の利点は得られない(さらにはわずかなペナルティでさえある)ことを示しています。
psusi

あなたはSzymon Roziewskiと同じユーザーですか?その場合、複数の回答を投稿しないでください。代わりに、元の回答を編集してください。最初のアカウントにアクセスできない場合は、アカウントの統合方法についてこちらをご覧ください。それまでの間、以前の回答を削除し、ここに含めます。
テルドン

わかりました、私はそれについてより包括的な調査をしました。ここにあるのは hardriveからいくつかのファイルを選択し、オプション-4eおよび-9eで圧縮しました。したがって、自分で最適なソリューションを見つけることをお勧めします。あなたが正しかった、いくつかのケースのために別のためのに対し、より良い-9eあるそうではありません:no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
のSzymon Roziewski

(コメントは5分間のみ編集可能)txt 109 txt/pdf 135
シモンロジエフスキ

2
+1。これは、OPがを使用してingファイルの最大圧縮を決定する方法を見つけるのに役立ちtarますxz
-cychoi

5

tar --help-I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

外部コンプレッサーで圧縮する:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

外部コンプレッサーの解凍:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

リストアーカイブ外部コンプレッサー:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst

1
これは有効な答えのように見えますが、実際には、フォーマットを修正し、オプションの説明を-I追加することで大幅に改善されます。
dhag


3

関心のある人にとって-e9-9、一般的なラップトップと比較して、0.4%小さく、圧縮時に20%遅く、解凍に3%遅くなります。Pythonソースコードのディレクトリ構造で実行されるタイミングは次のとおりです。

圧縮:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

減圧:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

ファイルサイズ:

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz

1
T0はマルチスレッドアーカイブを有効にするオプションであるため、変数名の選択が不適切です。
Dzenly

@Dzenlyあなたは正しい!ありがとうございました!変更しました。
ホブ

2

これは質問に対する正確な答えではありませんが、2つではなく1つのコマンドを使用できます。

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

「ultras ettings」を使用して、ディレクトリ「dir1」のすべてのファイルをアーカイブarchive.7zに追加します

サポートされている他の形式は、zip、gzip、bzip2、またはtarです。このため7z、後に置き換え-tます。
- ソースman 7z

注:7z形式にはファイルシステムのアクセス許可が保存されないためこのコマンドを使用して個人ファイル以外のシステムファイルをバックアップしないでください。


5
問題は、両方ともLZMA圧縮を使用しているにもかかわらず、7zではなくxzについてでした。
アメディーヴァンガッセ

2

xz-utilsのバージョンv5.2.0のマルチコアマシンでは、次を確認します。

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

最大数のコアと最大圧縮を使用する場合:

export XZ_DEFAULTS="-9 -T 0 "

または、使用するコアの数に-Tを設定します。

次に:

tar cJf target.tar.xz source

また、これは圧縮レベルを選択するために役立つかもしれません:

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


1

複数のスレッドを使用してこれをより速く完了したいが、他の作業を実行している間にシステムを遅くすることなく、使用するスレッドの-Tn数をnに追加しnice、圧縮をアイドル優先度に降格してみてください。

モデル(4スレッド用):

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz

大きなディレクトリ(数GB)でこれを行うとき、topまたは視聴するhtopときに試してみてください。うまくいけばxz、Niceの値が19(最低優先度)のスレッドがいくつか表示されるはずです。

また、次のように、できるだけ簡潔にすることも-f -できます。他の回答では、tarのデフォルト出力はstdoutであるため、単に必要ありません。

nicetarプロセスも可能ですが、xzパイプラインのCPUが常にボトルネックになるため、必要だとは思いません。

実用的なメモ、私はめったにxz -9何にも使用しません。CPUや時間のためではなく、メモリの要求が高いためです。見てくださいhttps://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compressionをxzコンプレッサーは、のようなbzip2、しかし、とは違ってgzip、より高い圧縮率のために、より多くのメモリを使用しています。それは一緒にそれを置くxz他の圧縮機よりもはるかに多くのメモリを使用して、あなたは簡単にメモリの600以上MBを使用することができます。また、を使用し-Tてスレッド化された圧縮を有効にすると、メモリ要求がさらに増加し​​ます。たとえば、1〜2 GBのメモリを搭載した小さなVMで小さなサービスを実行している場合など、注意が必要です。誤って影響を与える可能性があります。


1

Mac OS Xでは、パラメーターを渡す別の方法tar--options=フラグを使用することです。例えば、

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