回答:
xz
コマンドラインフラグの標準セット(圧縮レベルフラグを含む)を尊重すると仮定すると、以下を試すことができます。
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
-9e
は最高レベルですが、非常に時間がかかります
-9e
常に最良の結果が得られるとは限りません-ここでポイント8を参照してくださいrootusers.com/13-simple-xz-examples
--threads=0
xzに追加すると大幅な改善が見られる場合があります
tar
bashまたは派生シェルで最近の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
rc
andでサポートされていますakanga
。fish
、csh
、tcsh
およびes
それをサポートしていない主要なシェルです。そこで、env
コマンドを使用します。
-9
と-e
XZは付き合えない、あなたは欲しいXZ_OPT=-e9
けど@krzykが指摘したように、-eで極端に遅い
XZ_OPT
はで実装された機能ではありませんtar
。これはの機能ですxz
。をtar
呼び出すxz
と、env-variableが単に渡されます。
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
よりも優れています
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
option -e, --extreme
圧縮プリセット(-0 ... -9)を変更して、コンプレッサーまたはデコンプレッサーのメモリ使用量を増やすことなく、少し良い圧縮率を実現できるようにします(例外:プリセット-0 ... -2)。欠点は、圧縮時間が劇的に増加することです(簡単に2倍になります)。
-9
場合)-9e
、使用しないでください、そうですか?
XZ_OPT="-9e -T0" tar -cJf ...
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に設定し、深さも調整します)。
さまざまなオプションを試すことができます
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
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
txt 109 txt/pdf 135
tar
ますxz
。
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
-I
追加することで大幅に改善されます。
関心のある人にとって-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
これは質問に対する正確な答えではありませんが、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形式にはファイルシステムのアクセス許可が保存されないため、このコマンドを使用して個人ファイル以外のシステムファイルをバックアップしないでください。
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
また、これは圧縮レベルを選択するために役立つかもしれません:
複数のスレッドを使用してこれをより速く完了したいが、他の作業を実行している間にシステムを遅くすることなく、使用するスレッドの-Tn
数をnに追加しnice
、圧縮をアイドル優先度に降格してみてください。
モデル(4スレッド用):
tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz
大きなディレクトリ(数GB)でこれを行うとき、top
または視聴するhtop
ときに試してみてください。うまくいけばxz
、Niceの値が19(最低優先度)のスレッドがいくつか表示されるはずです。
また、次のように、できるだけ簡潔にすることも-f -
できます。他の回答では、tar
のデフォルト出力はstdoutであるため、単に必要ありません。
nice
tarプロセスも可能ですが、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で小さなサービスを実行している場合など、注意が必要です。誤って影響を与える可能性があります。
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.
ます。