XZ(1) | XZ Utils | XZ(1) |
名称
xz, unxz, xzcat, lzma, unlzma, lzcat - .xz と .lzma ファイルを圧縮するか、または復元します書式
xz [ option]... [ file]...unxz は、 xz --decompress と同等です。
xzcat は、 xz --decompress --stdout と同等です。
lzma は、 xz --format=lzma と同等です。
unlzma は、 xz --format=lzma --decompress と同等です。
lzcat は、 xz --format=lzma --decompress --stdout と同等です。
ファイルを復元する必要があるスクリプトを書くとき、名前 unxz と xzcat の代わりに、適切な引数 ( xz -d または xz -dc) を付けて、常に名前 xz を使用することをお勧めします。
解説
xz は、 gzip(1) と bzip2(1) と同様のコマンドライン構文で使用する汎用のデータ圧縮ツールです。ネイティブのファイル形式は、 .xz 形式ですが、LZMA ユーティリティによって使用される古い .lzma 形式とコンテナ形式のヘッダのない生の圧縮ストリームもまたサポートされます。xz は、選択された動作に従って、各 file を圧縮するか、または復元します。 files が与えられないか、または file が - であるなら、 xz は、標準入力から読み込んで、標準出力に処理されたデータを書き込みます。 xz は、標準出力が端末であるなら圧縮されたデータを書き込むことを拒否します (エラーを表示して、 file をスキップします)。同様に、 xz は、標準入力が端末であるなら、圧縮されたデータを読み込むことを拒否します。
--stdout が指定されないなら、 - 以外の files は、ソースの file 名から得られる新しいファイルに書き込まれます:
- •
- 圧縮するとき、ターゲットファイル形式 ( .xz または .lzma) の接尾辞が、ターゲットファイル名を得るためにソースファイル名に追加されます。
- •
- 復元するとき、 .xz または .lzma の接尾辞が、ターゲットファイル名を得るためにファイル名から取り除かれ。 xz は、また、接尾辞の .txz と .tlz を認識して、それらを .tar 接尾辞に置き換えます。
ターゲットファイルが既に存在しているなら、エラーが表示され、 file は、スキップされます。
標準出力に書き込まれないなら、次のいずれかが適用されて、 xz は、警告を表示して、 file をスキップします:
- •
- file が通常ファイルではありません。シンボリックリンクは、たどられません、従って、それらは、通常ファイルであると見なされません。
- •
- file には、2 つ以上のハードリンクがあります。
- •
- file には、setuid、setgid またはスティッキビットの設定があります。
- •
- 動作モードが圧縮に設定され、 file にはターゲットファイル形式の接尾辞 ( .xz 形式に圧縮するとき、 .xz または .txz で、 .lzma 形式に圧縮するとき、 .lzma または .tlz) が既にあります。
- •
- 動作モードが復元に設定され、 file には、サポートしているファイル形式 ( .xz, .txz, .lzma, または .tlz) のいずれかの接尾辞がありません。
file の圧縮、または復元が成功して後に、 xz は、ソース file からターゲットファイルに所有者、グループ、パーミッション、アクセス時刻と更新時刻をコピーします。グループのコピーに失敗するなら、ターゲットファイルが、ソース file にアクセスするパーミッションを持っていないユーザにとってアクセス可能とならないので、パーミッションは、変更されます。 xz は、アクセス制御リストまたは拡張された属性のような他のメタデータのコピーをまだサポートしていません。
いったんターゲットファイルのクローズに成功すると、 --keep が指定されなかったなら、ソース file は、削除されます。ソース file は、出力が標準出力に書き込まれるなら、決して削除されません。
SIGINFO または SIGUSR1 が xz プロセスに送られると、標準エラーに進捗情報を印刷 (表示) します。これは、標準エラーが端末であるときのみ使用するように制限されるので、 --verbose を使用すると、進捗インディケータを自動的に更新して表示されます。
メモリ使用量
xz のメモリ使用量は、数 100 キロバイトから数ギガバイトまで圧縮設定に依存して異なります。ファイルを圧縮するとき使用される設定は、復元プログラムの必要メモリを決定します。通常、復元プログラムは、ファイルを作成するとき、圧縮プログラムが必要としたメモリの容量の 5 % から 20 % を必要とします。例えば、現在 xz -9 で作成されたファイルを復元すると、65 MiB のメモリを要求します。それでも、復元するためのメモリの数ギガバイトを必要とする .xz ファイルを所有することは、可能です。特に古いシステムのユーザは、膨大なメモリ使用量の可能性がうっとうしいことに気付きます。不快な驚きを防ぐために、 xz には、デフォルトで無効にされた、組み込みのメモリ使用量リミッタ (limiter) があります。いくつかのオペレーティングシステムがプロセスのメモリ使用量を制限する方法を提供しているとはいえ、それを当てにすることは、十分フレキシブルであると思われません (例えば、 mmap(2) を機能しないようにするために仮想記憶を制限する ulimit(1) を使用する傾向があります)。
コマンドラインのオプション --memlimit=limit でメモリ使用量リミッタを有効にすることができます。しばしば、環境変数 XZ_DEFAULTS を設定することによってデフォルトでリミッタを有効にすればより便利です、例えば、 XZ_DEFAULTS=--memlimit=150MiB。 --memlimit-compress=limit と --memlimit-decompress=limit を使用することによって、別々に圧縮と復元のために制限を設定することは可能です。 xz の単一の実行で圧縮と復元の両方が行えないので、 XZ_DEFAULTS の外側で、これらの 2 つのオプションを使用することは、めったに役に立ちません、そして、 --memlimit=limit (または -M limit) は、コマンドラインでタイプするのが短くなります。
復元するとき、指定されたメモリ使用量の制限を越えているなら、 xz は、エラーを表示し、ファイルを復元することは、失敗します。圧縮するとき、制限を越えているなら、 xz は、( --format=raw または --no-adjust を使用するときを除いて) 制限が超えないように、設定を縮小させようと試みます。このように、操作は、制限がそれほど小さくないなら、失敗しないでしょう。設定のスケーリングは、あらかじめ設定された圧縮レベルにマッチしないステップで行われます、例えば、制限が xz -9 のために必要な量よりわずかに少ないだけなら、設定は、 xz -8 までいっぱいではなく、少しだけ縮小されます。
連結と .xz ファイルで詰め物
そのままで、 .xz ファイルを連結することは可能です。 xz は、まるでそれらが単一の .xz ファイルであるかのように、そのようなファイルを復元します。連結された部分または最後の部分の後の間に詰め物を挿入することは可能です。詰め物は、ヌル (null) バイトから成らなければなりません、そして、詰め物のサイズは 4 バイトの倍数でなければなりません。これは、役に立つ場合があります、例えば、 .xz ファイルが 512 バイトのブロックでファイルサイズを測定するメディアに格納される場合です。
連結と詰め物は、 .lzma ファイルまたは生のストリームで許可されていません。
オプション
整数接尾辞と特別な値
整数引数が予想されるほとんどの場所では、大きな整数を容易に示すオプションの接尾辞がサポートされています。整数と接尾辞の間には、空白があってはなりません。- KiB
- 整数は、1,024 (2^10) が乗算されます。 Ki, k, kB, K と KB は、 KiB の同義語として受け付けられます。
- MiB
- 整数は、1,048,576 (2^20) が乗算されます。 Mi, m, M と MB は、 MiB の同義語として受け付けられます。
- GiB
- 整数は、1,073,741,824 (2^30) が乗算されます。 Gi, g, G と GB は、 GiB の同義語として受け付けられます。
オプションによってサポートされた最大の整数値を示すために特別な値 max を使用することができます。
動作モード
複数の動作モードのオプションが与えられるなら、最後のものに効果があります。- -z, --compress
- 圧縮します。動作モードオプションが指定されなくて、他の動作モードがコマンド名から意味されないとき (例えば、 unxz は、 --decompress を意味します) これは、デフォルトの動作モードです。
- -d, --decompress, --uncompress
- 圧縮復元します。
- -t, --test
- 圧縮された files の整合性をテストします。このオプションは、復元されたデータが標準出力に書き込まれる代わりに捨てられることを除いて、 --decompress --stdout と同等です。ファイルは、作成されず、削除もされません。
- -l, --list
- 圧縮された file に関する情報を印刷 (表示) します。復元された出力は、生成されず、ファイルは、作成されず、削除もされません。リストモードで、プログラムは、標準入力、または、他のシーク可能でないソースから圧縮されたデータを読み込むことはできません。
-
- デフォルトのリストは、1 行ごとに 1 つのファイルで、 files に関する基本情報を表示します。より詳細な情報を得るためには、 --verbose オプションも使用します。詳しい情報については、 --verbose を 2 度使用しますが、すべてのその他の情報を得るために、多くのシークを必要とするので、遅くなることに注意してください。冗長な出力の幅が 80 文字を越えるので、端末が十分広くないなら、例えば、 less -S で出力をパイプに通すのが、便利であるかもしれません。
-
- 正確な出力は、 xz のバージョンと異なったロケールの間で異なるかもしれません。マシンで読み込み可能な出力については、 --robot --list が使用されるべきです。
動作修飾子
- -k, --keep
- 入力ファイルを削除しません。
- -f, --force
- このオプションには、次のいくつかの効果があります:
- •
- ターゲットファイルが既に存在するなら、圧縮するか、または復元する前に、それを削除します。
- •
- たとえ入力が通常ファイルへのシンボリックリンクである、2 つ以上のハードリンクをあるか、または setuid、setgid、またはスティッキビットがあっても、圧縮するか、または復元します。 setuid、setgid とスティッキビットは、ターゲットファイルにコピーされません。
- •
- --decompress --stdout で使用され、 xz がソースファイルのタイプを解釈できないとき、ソースファイルは、標準出力にコピーされます。これによって、 xzcat --force を xz で圧縮されていないファイルに対して cat(1) のように使用することができます。将来的に xz が標準出力にそのままそれらをコピーする代わりにより多くのタイプのファイルを復元するかもしれない、新しい圧縮されたファイル形式を xz がサポートするかもしれないことに注意してください。単一のファイル形式のみを復元するように xz を制限するために --format= format を使用することができます。
- -c, --stdout, --to-stdout
- ファイルの代わりに標準出力に圧縮されるか復元されたデータを書き込みます。これは、 --keep の意味を含みます。
- --no-sparse
- スパース (sparse) ファイルの作成を無効にします。デフォルトで、通常ファイルに復元するとき、 xz は、復元されたデータが長いひと続きのバイナリ 0 を含んでいるなら、ファイルをスパースにしようと試みます。また、標準出力が通常ファイルに結び付けられ、特定の追加条件がそれを安全にするように満たされる限り、標準出力に書き込むとき、それは、動作します。スパースファイルを作成することは、ディスクの空間を節約し、ディスク I/O の量を減少させることによって、復元をスピードアップします。
- -S .suf, --suffix= .suf
- 復元するとき、 .xz または .lzma の代わりにターゲットファイルに対して接尾辞として .suf を使用します。標準出力に書き込むのではなく、ソースファイルに接尾辞 .suf が既にあるなら、警告が表示され、ファイルをスキップします。
-
- 復元するときに、 .xz, .txz, .lzma または .tlz 接尾辞があるファイルに加えて接尾辞 .suf があるファイルを認識します。ソースファイルに接尾辞 .suf があるなら、接尾辞は、ターゲットファイル名を得るために取り除かれます。
-
- 生のストリーム ( --format=raw) を圧縮するか、または復元するとき、標準出力に書き込まないなら、生のストリームのためのデフォルトの接尾辞がないので、接尾辞は、常に指定されなければなりません。
- --files[ = file]
- file から処理するためにファイル名を読み込みます。 file が省略されるなら、ファイル名は、標準入力から読み込まれます。ファイル名は、改行文字で終っていなければなりません。ダッシュ ( -) は、通常のファイル名として扱われます。それは、標準入力を意味しません。また、ファイル名がコマンドライン引数として与えられるなら、ファイル名が file から読み込まれる前に、それらは、処理されます。
- --files0[ = file]
- ヌル文字で各ファイル名が終っていなければらないことを除いて、これは、 --files[ = file] と同じです。
基本的なファイル形式と圧縮オプション
- -F format, --format= format
- 圧縮するか、または復元するファイル format (形式) を指定します:
- auto
- これは、デフォルトです。圧縮するとき、 auto は、 xz と同等です。復元するとき、入力ファイルの形式は、自動的に検出されます。 ( --format=raw で作成される) 生のストリームは、自動検出されないことに注意してください。
- xz
- ファイル形式を .xz に圧縮するか、または復元するとき、 .xz ファイルのみを受け付けます。
- lzma, alone
- 古い .lzma ファイル形式を圧縮するか、または復元するとき .lzma ファイルのみを受け付けます。代替名 alone は、LZMA Utils の後方互換性のために提供されてます。
- raw
- (ヘッダがない) 生のストリームを圧縮するか、または復元します。これは、アドバンスドユーザのためだけに作られています。生のストリームをデコードするために、 --format=raw を使用して、明白に、通常、コンテナヘッダに格納されている、フィルタチェーンを指定する必要があります。
- -C check, --check= check
- 整合性チェックのタイプを指定します。チェックは、復元されたデータから計算され、 .xz ファイルに格納されます。このオプションは、 .xz 形式に圧縮するときのみ効果があります。 .lzma 形式は、整合性チェックをサポートとしていません。 (もしあるなら) 整合性チェックは、 .xz ファイルが復元されるとき、検証されます。
-
- サポートされている check タイプは、次の通りです:
- none
- 整合性チェックを全く計算しません。通常、これは、悪い考えです。これは、データの整合性が他の手段によって検証されるとき、役に立ちます。
- crc32
- IEEE-802.3 (イーサネット) から多項式を使用して、CRC32 を計算します。
- crc64
- ECMA-182 から多項式を使用して CRC64 を計算します。損傷したファイルの検出で CRC32 よりわずかに良くて、速度差がごくわずかであるので、これはデフォルトです。
- sha256
- SHA-256 を計算します。これは、CRC32 と CRC64 よりいくらか遅いです。
-
- .xz ヘッダの整合性は、常に CRC32 で検証されます。それを変更するか、または無効にすることはできません。
- -0 ... -9
- 圧縮プリセットレベルを選択します。デフォルトは、 -6 です。複数のプリセットレベルが指定されるなら、最後のものが効果があります。カスタムフィルタチェーンが既に指定されていたなら、圧縮プリセットレベルを設定すると、カスタムフィルタチェーンをクリアします。
-
- プリセットの違いは、 gzip(1) と bzip2(1) より重要です。選択された圧縮の設定は、復元プログラムの必要メモリを決定します、したがって、あまりに高いプリセットレベルは、少ない RAM しかない古いシステムでファイルを復元することが苦痛になるかもしれません。はっきり言えば、しばしば gzip(1) と bzip2(1) で使用するように、 すべてに盲目的に-9 を使用することは、よい考えではありません。
- -0 ... -3
- いくらか速いプリセットがあります。 -0 は、はるかによい圧縮する、 gzip -9 より時々速いです。高いものは、しばしば、同程度か、またはより良い圧縮比がある bzip2(1) に匹敵する速度がありますが、結果は、圧縮されているデータのタイプに大きく依存します。
- -4 ... -6
- 古いシステムでさえ妥当な復元プログラムのメモリ使用量を保持しているとはいえ、非常に良い圧縮ができています。 -6 は、デフォルトです、例えば、たった 16 MiB の RAM のシステムでさえ復元可能となる必要があるファイルを配布するためのように、通常、良い選択です。 ( -5e または -6e は、また、考慮する価値があります。 --extreme を参照してください。)
- -7 ... -9
- これらは、 -6 に似ていますが、圧縮プログラムと復元プログラムでより多いメモリが必要です。これらは、それぞれ、8 MiB, 16 MiB, and 32 MiB より大きなファイルを圧縮するときだけ役に立ちます。
-
- 同じハードウェアで、復元速度は、1 秒ごとに圧縮されるデータのバイト数でほぼ一定です。言い換えれば、圧縮が良ければ良いほど、通常、復元は、より速くなります。これは、また、1 秒ごとに生成された復元された出力の量が大きく異なることを意味します。
-
- 次のテーブルは、プリセットの要約された機能です:
プリセット | DictSize | CompCPU | CompMem | DecMem |
-0 | 256 KiB | 0 | 3 MiB | 1 MiB |
-1 | 1 MiB | 1 | 9 MiB | 2 MiB |
-2 | 2 MiB | 2 | 17 MiB | 3 MiB |
-3 | 4 MiB | 3 | 32 MiB | 5 MiB |
-4 | 4 MiB | 4 | 48 MiB | 5 MiB |
-5 | 8 MiB | 5 | 94 MiB | 9 MiB |
-6 | 8 MiB | 6 | 94 MiB | 9 MiB |
-7 | 16 MiB | 6 | 186 MiB | 17 MiB |
-8 | 32 MiB | 6 | 370 MiB | 33 MiB |
-9 | 64 MiB | 6 | 674 MiB | 65 MiB |
-
- カラムの説明:
- •
- DictSize は、LZMA2 辞書サイズです。それは、復元されたファイルのサイズより大きな辞書を使用する消費メモリです。これは、実際にそれらの必要がないとき、プリセット -7 ... -9 を使用することを避ける良い理由です。 -6 以下では、通常、消費されるメモリ量は、問題にならないほど低くなります。
- •
- CompCPU は、圧縮速度に影響する LZMA2 の設定の簡略化された表現です。辞書サイズは、速度にも影響します、それd、CompCPU がレベル -6 ... -9 と同じである一方、より高いレベルは、まだ少し遅くなる傾向があります。従って、より遅くて、ことによるとより良い圧縮さえ得るためには、 --extreme を参照してください。
- •
- CompMem は、単一スレッドモードで圧縮プログラムの必要メモリを含んでいます。それは、 xz バージョンの間でわずかに変わるかもしれません。将来のマルチスレッド化されたモードのいくつかの必要メモリは、単一スレッドモードのものより著しく高いかもしれません。
- •
- DecMem は、復元プログラムの必要メモリを含んでいます。すなわち、圧縮設定は、復元プログラムの必要メモリを決定します。正確な復元プログラムのメモリ使用量は、LZMA2 辞書サイズよりわずかに多くなりますが、テーブルの値は、次の完全な MiB まで四捨五入されています。
- -e, --extreme
- すこしより良い圧縮比をうまくいけば取得するために選択された圧縮のプリセットレベル ( -0 ... -9) のより遅い異形を使用しますが、また、不運で、より悪くなるかもしれません。復元プログラムのメモリ使用量は、影響を受けませんが、圧縮プログラムのメモリ使用量は、プリセットレベル -0 ... -3 で少し増加します。
-
- 辞書サイズ 4 MiB と 8 MiB で 2 つのプリセットがあるので、プリセット -3e と -5e は、それぞれ、 -4e と -6e よりわずかに速い設定 (下の CompCPU) を使用します。そのように、2 つプリセットは、同じはありません。
プリセット | DictSize | CompCPU | CompMem | DecMem |
-0e | 256 KiB | 8 | 4 MiB | 1 MiB |
-1e | 1 MiB | 8 | 13 MiB | 2 MiB |
-2e | 2 MiB | 8 | 25 MiB | 3 MiB |
-3e | 4 MiB | 7 | 48 MiB | 5 MiB |
-4e | 4 MiB | 8 | 48 MiB | 5 MiB |
-5e | 8 MiB | 7 | 94 MiB | 9 MiB |
-6e | 8 MiB | 8 | 94 MiB | 9 MiB |
-7e | 16 MiB | 8 | 186 MiB | 17 MiB |
-8e | 32 MiB | 8 | 370 MiB | 33 MiB |
-9e | 64 MiB | 8 | 674 MiB | 65 MiB |
-
- 例えば、最も速いものから最も遅をものまでの順序が、 -5, -6, -5e と -6e である、8 MiB 辞書を使用する 4 つのプリセットの合計があります。
- --fast
- --best
- これらは、それぞれ -0 と -9 に対していくらか誤解を招きそうな別名です。これらは、LZMA Utils との後方互換性のためだけに提供されています。これらのオプションを使用するのを避けてください。
- --memlimit-compress= limit
- 圧縮のためのメモリ使用量の制限を設定します。このオプションが複数回指定されるなら、最後のものに効果があります。
-
- 圧縮の設定が limit を越えるなら、 xz は、制限が超えないように下方に設定を調節して、自動調整が行われたことの通知を表示します。 --format=raw で圧縮されるとき、または --no-adjust が指定されるなら、そのような調整は、行われません。そのような場合、エラーが表示され、 xz は、終了ステータス 1 で終了します。
-
- 次の複数の方法で limit を指定することができます:
- •
- limit は、バイト単位の絶対値で指定できます。 MiB のような整数の接尾辞を使用することが役に立つかもしれません。例: --memlimit-compress=80MiB
- •
- 物理的なメモリ (RAM) の合計の割合として limit を指定することができます。異なったコンピュータの間で共有されるシェル初期化スクリプトで XZ_DEFAULTS 環境変数を設定するとき、これは、特に役に立つかもしれません。そのように、制限は、より多くのメモリがあるシステムで、自動的に大きくなります。例: --memlimit-compress=70%
- •
- limit を 0 に設定することによって、デフォルト値にリセットして戻すことができます。これは、現在、 limit を max (メモリ使用量の制限なし) に設定するのと同等です。いったんマルチスレッド化のサポートが実装されると、マルチスレッド化された場合のために 0 と max の間には、違いがあるかもしれないので、詳細が決められるまで、 max の代わりに 0 を使用することをお勧めします。
-
- また、セクション メモリ使用量 も参照してください。
- --memlimit-decompress= limit
- 復元のためのメモリ使用量の制限を設定します。これは、また、 --list に影響します。操作が limit を超さずに不可能であるなら、 xz は、エラーを表示し、ファイルを復元することは、失敗します。 limit を指定する可能な方法については、 --memlimit-compress= limit を参照してください。
- -M limit, --memlimit= limit, --memory= limit
- これは、 --memlimit-compress= limit --memlimit-decompress= limit 指定することと同等です。
- --no-adjust
- 圧縮の設定がメモリ使用量の制限を超えているなら、エラーを表示して、終了します。デフォルトは、メモリ使用量の制限が超えないように、下方に設定を調節することです。自動的な調整は、生ストリームを作成するとき、常に無効にされます ( --format=raw)。
- -T threads, --threads= threads
- 使用するワーカスレッドの数を指定します。スレッドの実際の数は、より多くのスレッドを使用がメモリ使用量の制限を超えているなら、 threads より少ないかもしれません。
-
- マルチスレッド化された圧縮と復元は、まだ実装されていないので、 このオプションは、現在のところ効果がありません。
-
- コメントを歓迎します。 複雑な要素は、多くのスレッドを使用するとメモリ使用量が劇的に増加するということです。マルチスレッド化がデフォルトであるなら、単一スレッドとマルチスレッド化モードが同じ出力を生成することができるようにたぶんそれを行えるので、スレッド化がデフォルトで有効にされるなら、圧縮比がかなり影響を受けないことに注意してください。
カスタムコンプレッサフィルタチェーン
カスタムフィルタチェーンによって、プリセットレベルに関連する設定を当てにする代わりに詳細な圧縮設定を指定できます。カスタムフィルタチェーンが指定されるとき、圧縮のプリセットレベルオプション ( -0 ... -9 と --extreme) は、静かに無視されます。フィルタチェーンは、コマンドラインのパイプと互換性があります。圧縮するとき、復元された入力は、出力が (もしあれば) 次のフィルタに行く最初のフィルタに行きます。最後のフィルタの出力は、圧縮されたファイルに書き込まれます。チェーンのフィルタの最大数は、4 ですが、通常、フィルタチェーンには、 1 つか 2 つのフィルタしかありません。
多くのフィルタには、フィルタチェーンでそれらを指定できるところで制限があります: いくつかのフィルタは、チェーンの最後のフィルタとしてのみ動作でき、いくつかは、最後でないフィルタとしてのみ動作し、および、いくつかは、チェーンの任意の位置でも動作します。フィルタによって、この制限は、フィルタデザインに固有であるか、またはセキュリティの問題を防ぐために存在しています。
カスタムフィルタチェーンは、フィルタチェーンで必要とされる順序で 1 つ以上のフィルタオプションを使用することによって指定されます。すなわち、フィルタオプションの順序は、重要です! 生のストリーム ( --format=raw) をデコードするとき、フィルタチェーンは、圧縮するとき指定された同じ順序で指定されます。
フィルタは、コンマで区切られたリストとしてフィルタ特有の option を取ります。 option の余分なコンマは、無視されます。すべてのオプションには、デフォルト値があるので、利用者は、変更したものだけを指定するだけです。
- --lzma1[ = options]
- --lzma2[ = options]
- LZMA1 または LZMA2 フィルタをフィルタチェーンに追加します。チェーンの最後のフィルタとしてのみ、これらのフィルタを使用することができます。
-
- LZMA1 は、LZMA1 だけをサポートする、古い .lzma ファイル形式だけをサポートする、古いフィルタです。 LZMA2 は、LZMA1 のいくつかの実用上の問題を修正した LZMA1 の更新されたバージョンです。 .xz 形式は、LZMA2 を使用し、LZMA1 を全くサポートしていません。 LZMA1 と LZMA2 の圧縮の速度と比率は、ほとんど同じです。
-
- LZMA1 と LZMA2 は、次の同じ組の option を共有しています:
- preset= preset
- すべての LZMA1 または LZMA2 の option を preset にリセットします。 preset は、単一文字のプリセット修飾子が続く、整数で構成されます。整数は、 0 から 9 までを指定でき、コマンドラインのオプションの -0 ... -9 にマッチします。現在、唯一サポートされている修飾子は、 --extreme にマッチする、 e です。デフォルトの preset は、LZMA1 または LZMA2 の option の残りのためのデフォルト値がとられる、 6 です。
- dict= size
- 辞書 (ヒストリバッファ) size (サイズ) は、最近処理されて復元されたデータのどのくらいのバイトがメモリに保持されるかを示します。アルゴリズムは、復元されたデータの (マッチする) 繰り返しているバイトシーケンスを見つけて、それらを辞書中の現在のデータへの参照に置き換えようと試みます。辞書が大きければ大きいほど、マッチを見つける機会は、より高くなります。したがって、増加する辞書 size は、通常圧縮比を改良しますが、復元されたファイルより大きな辞書は、メモリを消費します。
-
- 典型的な辞書 size (サイズ) は、64 KiB から 64 MiB です。最小は、4 KiB です。現在、圧縮のための最大は、1.5 GiB (1536 MiB) です。復元プログラムは、LZMA1 と LZMA2 ストリーム形式のための最大である、最大 1 バイトで 4 GiB 未満の辞書を既にサポートしています。
-
- 辞書 size とマッチファンダ ( mf) は、ともに LZMA1 または LZMA2 エンコーダのメモリ使用量を決定します。同じ (または大きい) 辞書 size は、圧縮するとき使用された復元に必要です、その結果、圧縮するとき、デコーダのメモリ使用量は、使用される辞書サイズによって決定されます。 .xz ヘッダは、 2^ n または 2^ n + 2^( n-1) としていずれかの辞書 size を格納するので、これらの size は、圧縮のためにいくらか優先されます。他の size は、 .xz ヘッダに格納されるとき、切り上げられます。
- lc= lc
- リテラルのコンテキストビットの数を指定します。最小は、0 で、最大は、4 です。デフォルトは、3 です。さらに、 lc と lp の合計は、4 を超えてはいけません。
-
- マッチとしてエンコードできないすべてのバイトは、リテラルとしてエンコードされます。すなわち、リテラルは、同時に 1 つエンコードされる単なる 8 ビットのバイトです。
-
- リテラルのコード化は、以前に復元されたバイトの最上位の lc ビットが次のバイトに関連があるという仮定を行います。例えば、典型的な英文のテキストで、大文字は、しばしば小文字があとに続き、通常、小文字は、別の小文字に続きます。 US-ASCII 文字セットでは、最上位の 3 ビットは、大文字に対して 010 で、小文字に対して 011 です。 lc が少なくとも 3 であるとき、リテラルのコード化は、復元されたデータでこの特性を利用することができます。
-
- 通常、デフォルト値 (3) は、良いことです。最大の圧縮をしたいなら、 lc=4 をテストしてください。時々、少し助け、時々、圧縮が、より悪くなります。それがより悪くするなら、例えば、 lc=2 もテストしてください。
- lp= lp
- リテラル位置ビットの数を指定します。最小は、0 で、最大は、4 です。デフォルトは、0 です。
-
- lp は、リテラルをコード化するとき、復元されたデータの整列の種類がどのように想定されるかに影響します。整列に関する詳しい情報にについては、下記の pb を参照してください。
- pb= pb
- 位置ビットの数を指定します。最小は、0 で、最大は、4 です。デフォルトは、2 です。
-
- pb は、一般的に、復元されたデータの整列の種類がどのように想定されるかに影響します。デフォルトは、より良い推測がないとき、しばしばそれは、良い選択である、 4 バイトの整列 (2^ pb=2^2=4) を意味します。
-
- 整列が知られているとき、 pb を設定すると、それに応じてファイルサイズが少し減少します。例えば、1 バイトの整列 (US-ASCII, ISO-8859-*, UTF-8) があるテキストファイルで、 pb=0 を設定すると、わずかに圧縮を改良することできます。 UTF-16 テキストに関して、 pb=1 は、良い選択です。整列が 3 バイトのように奇数であるなら、 pb=0 は、最も良い選択であるかもしれません。
-
- pb と lp で想定された整列を調整することができるにもかかわらず、 LZMA1 と LZMA2 は、まだ 16 バイトの整列がわずかに有利です。 LZMA1 または LZMA2 で圧縮されることがあり得るファイル形式を設計するとき、考慮に入れる価値があるかもしれません。
- mf= mf
- マッチする finder は、エンコーダ速度、メモリ使用量と圧縮比に大きな影響を与えます。デフォルトは、次の preset に依存します: 0 は、 hc3 を使用し、 1-3 は、 hc4 を使用し、そして残りは、 bt4 を使用します。
-
-
次のマッチ finder がサポートされています。以下のメモリ使用量の式は、
dict が 2 のべき乗であるとき、実体に最も近い概算です。
- hc3
-
Hash Chain with 2- and 3-byte hashing
- hc4
-
Hash Chain with 2-, 3-, and 4-byte hashing
- bt2
-
Binary Tree with 2-byte hashing
- bt3
-
Binary Tree with 2- and 3-byte hashing
- bt4
-
Binary Tree with 2-, 3-, and 4-byte hashing
- mode= mode
- 圧縮 mode は、マッチする finder によって作成されるデータを解析するためのメソッド指定します。サポートされる mode は、 fast と normal です。デフォルトは、 preset 0-3 のためには fast で、 preset 4-9 のためには normal です。
-
- 通常、 fast は、Hash Chain マッチ finder で、 normal は、Binary Tree マッチ finder で使用されます。また、これは、 preset が何、を行うかです。
- nice= nice
- 何がマッチに対する nice の長さであると考えられているかを指定します。いったん、少なくとも nice バイトのマッチが見つけられると、アルゴリズムは、できる限り良いマッチに対する検索を停止します。
-
- nice は、2-273 バイトを指定できます。より高い値は、速度を犠牲にして、より良い圧縮比を与える傾向があります。デフォルトは、 preset に依存します。
- depth= depth
- マッチ finder で最大の検索の深さを指定します。デフォルトは、圧縮プログラムが mf と nice から適度な depth を決定する、特別の値 0 です。
-
- Hash Chains のための妥当な depth (深さ) は、4-100 で、Binary Trees のためには、16-1000 です。 depth に対して非常に大きな値を使用すると、エンコーダは、いくつかのファイルで極めて遅くなるかもしれません。あまりに長い時間が掛かる場合に圧縮に割り込む準備ができていないなら、 1000 以上の depth を設定することを避けてください。
-
- 生のストリーム ( --format=raw) をデコードするとき、 LZMA2 は、辞書の size だけを必要とします。また、LZMA1 は、 lc, lp と pb を必要とします。
- --x86[ = options]
- --powerpc[ = options]
- --ia64[ = options]
- --arm[ = options]
- --armthumb[ = options]
- --sparc[ = options]
- フィルタチェーンに分岐/呼び出し/ジャンプ (BCJ) フィルタを追加します。フィルタチェーンの最後でないフィルタとしてのみ、これらのフィルタを使用することができます。
-
- BCJ フィルタは、それらの絶対的な対照物へのマシンコードで相対アドレスに変換します。これは、データのサイズを変更しませんが、 LZMA2 が 0-15 % より小さい .xz ファイルを作成するのを助けることができる、冗長性が増強します。 BCJ フィルタは、常にリバーシブルであるので、間違ったタイプのデータのための BCJ フィルタを使用することによって、どんなデータの損失も起こりません。しかしながら、間違ったタイプのデータのための BCJ フィルタを適用することは、圧縮比をより悪くする傾向があるので、悪い考えです。 BCJ フィルタは、常にリバーシブルであるので、間違ったタイプのデータに関する BCJ フィルタを使用することは、どんなデータの損失ももたらしませんが、圧縮比をわずかに悪くするかもしれません。
-
- すべての実行形式で BCJ フィルタを適用することはよいことです。実行形式の選択でのみ適用する必要はありません。実行形式と実行形式でないファイルの両方を含むアーカイブに BCJ フィルタを適用すると、良い結果を得るかどうか分からないので、一般的に、配布のためのバイナリパッケージを圧縮するとき、むやみに BCJ フィルタを適用するのは良くありません。
-
- これらの BCJ フィルタは、非常に速く、わずかなメモリ量を使用します。 BCJ フィルタがファイルの圧縮比を改良するなら、同時に、復元速度を改良することができます。これは、同じハードウェアで、LZMA2 の復元速度が、およそ 1 秒あたりの圧縮されたデータの一定のバイト数であるからです。
-
- これらの BCJ フィルタは、圧縮比に関連する問題を知っていました:
- •
- 実行形式のコード (例えば、オブジェクトファイル、静的なライブラリと Linux カーネルモジュール) を含むいくつかのタイプのファイルには、フィルタ値で満たされた命令のアドレスがあります。それでも、これらの BCJ フィルタは、これらのファイルで圧縮をより悪くする、アドレス変換を行います。
- •
- 複数の同様の実行形式を含むアーカイブで BCJ フィルタを適用すると、 BCJ フィルタを使用しないより圧縮比が悪くなるかもしれません。これは、BCJ フィルタが実行形式のファイルの限界を検出しないで、各実行形式のためのアドレス変換カウンタをリセットしないからです。
-
- 上記の問題の両方は、将来、新しいフィルタで修理されるでしょう。古い BCJ フィルタは、新しいフィルタのデコーダが、より大きく、より多くのメモリを使用するので、組み込みシステムでまだ役に立ちます、
-
- 異なった命令セットには、異なった整列があります:
フィルタ | 整列 | 注 |
x86 | 1 | 32-ビットまたは 64-ビット x86 |
PowerPC | 4 | ビッグエンディアンのみ |
ARM | 4 | リトルエンディアンのみ |
ARM-Thumb | 2 | リトルエンディアンのみ |
IA-64 | 16 | ビッグ/リトルエンディアン |
SPARC | 4 | ビッグ/リトルエンディアン |
-
- BCJ フィルタでフィルタリングされたデータは、通常、LZMA2 で圧縮されるので、圧縮比は、LZMA2 オプションが選択された BCJ フィルタの整列にマッチするように設定されるなら、わずかに改良されるかもしれません。例えば、IA-64 フィルタで、LZMA2 (2^4=16) で pb=4 を設定することは、良いことです。 x86 フィルタは、例外です。通常、x86 の実行形式を圧縮するとき、LZMA2 のデフォルトの 4 バイトに整列することは、良いことです。
-
- すべての BCJ フィルタは、次の同じ option をサポートします:
- start= offset
- 相対と絶対アドレスの間で変換するときに使用される開始 offset オフセットを指定します。 offset は、フィルタの整列の倍数でなければなりません (上記のテーブルを参照)。デフォルトは、0 です。実際のところ、デフォルトは、良いです。カスタム offset を指定することは、ほとんど役に立ちません。
- --delta[ = options]
- フィルタチェーンに Delta フィルタを追加します。フィルタチェーンの最後でないフィルタとしてのみ Delta フィルタを使用することができます。
-
- 現在、簡単なバイト単位のデルタ計算だけがサポートされます。例えば、復元されたビットマップイメージまたは復元された PCM オーディオを圧縮するとき、役に立ちます。しかしながら、特殊用のアルゴリズムは、Delta + LZMA2 よりかなり良い結果を与えます。これは、特に、例えば、 flac(1) を付けて、速く、よりよく圧縮するオーディオで当てはまります。
-
- サポートされる option (オプション) は、次の通りです:
- dist= distance
- バイト単位でデルタ計算の distance を指定します。 distance は、1-256 でなければなりません。デフォルトは、1 です。
-
- 例えば、 dist=2 で 8 バイトの入力 A1 B1 A2 B3 A3 B5 A4 B7 で、出力は、 A1 B1 01 02 01 02 01 02 となります。
他のオプション
- -q, --quiet
- 警告と通知を抑制します。これを 2 度指定すると、エラーも抑制します。このオプションは、終了ステータスでの効果はありません。すなわち、警告が抑制されたとしても、警告を示す終了ステータスは、まだ使用されます。
- -v, --verbose
- 冗長にします。標準エラーが端末に接続されるなら、 xz は、進捗インディケータを表示します。 2 度 --verbose を指定すると、さらに冗長な出力が行われます。
-
- 進捗インディケータは、次の情報を表示します:
- •
- 完了の割合は、入力ファイルのサイズが知られているかどうかを表示されます。すなわち、パイプに関して割合を表示ことはできません。
- •
- (圧縮) を生産したか、または (復元) を消費した圧縮されるデータの量。
- •
- (圧縮) を消費したか、または (復元) を生産した復元されるデータの量。
- •
- これまで処理され圧縮されたデータの量をこれまで処理され復元されたデータの量を割ることによって計算される、圧縮比。
- •
- 圧縮または復元速度。これは、秒毎の消費される (圧縮) か、または生産される (復元)、復元されたデータの量として測定されます。 xz がファイルを処理し始めて以来、数秒が経過した後に表示されます。
- •
- 形式 M:SS または H:MM:SS の経過時間。
- •
- 推定の残りの時間は、入力ファイルのサイズが知られていて、 xz がファイルを処理し始めて以来、2、3 秒が既に経過しているときのみ、表示されます。時間は、コロンがないそれほど正確でない形式で表示されます、例えば、2 min 30 s (2 分 30 秒)。
-
- 標準エラーが端末でないとき、 --verbose によって xz は、ファイルを圧縮するか、または復元した後に、標準エラーに 1 つの行でファイル名、圧縮されたサイズ、復元されたサイズ、圧縮比とあるいま、また、速度と経過時間を印刷します。速度と経過時間は、操作が少なくとも数秒かかったときだけ、含まれます。操作が、例えば、ユーザの割り込みのために、終わらなかったなら、そして、入力ファイルのサイズが知られているなら、完了の割合も印刷されます。
- -Q, --no-warn
- 警告相当の状態が検出されたとしても、終了ステータスを 2 に設定しません。このオプションは、冗長のレベルに影響しません、したがって、 --quiet と --no-warn の両方は、警告を表示しないで、終了ステータスを変更しないように使用されなければなりません。
- --robot
- マシンで解析可能な形式でメッセージを印刷します。これは、様々なスクリプトの場合に、liblzma の代わりに xz を使用したい、フロントエンドを書くことを簡単にすることを目的としています。有効にされたこのオプションでの出力は、 xz リリースに渡って安定していることになっています。詳細については、セクション ロボットモード を参照してください。
- --info-memory
- 人間が読める形式で、 xz が、システムにあると思うどのくらいの物理的なメモリ (RAM) と圧縮と復元のためのメモリ使用量の制限を表示し、成功して終了します。
- -h, --help
- 最も一般的に使用されるオプションについて説明するヘルプメッセージを表示し、成功して終了します。
- -H, --long-help
- xz のすべての機能について説明するヘルプメッセージを表示し、成功して終了します。
- -V, --version
- 人間に読み込み可能なで xz と liblzma のバージョン番号を表示します。マシンで解析可能な出力を取得するには、 --version の前に --robot を指定します。
ロボットモード
ロボットモードは、 --robot オプションで活性化されます。それは、 xz の出力を他のプログラムによって簡単に構文解析します。現在 --robot は、 --version, --info-memory と --list とともにだけサポートされます。それは、将来、通常の圧縮と復元のためにサポートされます。バージョン
xz --robot --version は、次の形式で xz と liblzma のバージョン番号を印刷します:XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
- X
- メジャーバージョン。
- YYY
- マイナバージョン。偶数は、安定版です。奇数は、アルファまたはベータバージョンです。
- ZZZ
- 安定版のリリースのためのパッチレベル、または開発リリースのための公正なカウンタ。
- S
- 安定性。 0 は、アルファ、1 は、ベータ、そして、2 は、安定版です。 YYY が偶数であるとき、 S は、常に 2 であるべきです。
xz と liblzma が同じ XZ Utils リリースからであるなら、 XYYYZZZS は、両方の行で同じです。
例: 4.999.9beta は、 49990091 で、5.0.0 は、 50000002 です。
メモリ制限情報
xz --robot --info-memory は、3 つのタブで区切られたカラムで単一の行を印刷します:- 1.
- バイト単位の物理的なメモリ (RAM) の総量。
- 2.
- バイト単位の圧縮のためのメモリ使用量の制限。単一スレッド化されたモードのためのデフォルトの設定を示す 0 の特別な値は、制限がないのと同じです。
- 3.
- バイト単位の復元のためのメモリ使用量の制限。単一スレッド化されたモードのためのデフォルトの設定を示す 0 の特別な値は、制限がないのと同じです。
将来、 xz --robot --info-memory の出力は、より多くのカラムがあるかもしれませんが、決して単一行以上とはなりません。
リストモード
xz --robot --list は、タブで区切られた出力を使用します。あらゆる行の最初のカラムには、その行で見つけられた情報のタイプを示す文字列があります:- name
- ファイルをリスト始めるとき、これは、常に最初の行です。行の第 2 カラムは、ファイル名です。
- file
- この行は、 .xz ファイルに関する全般的な情報を含んでいます。この行は、常に、 name の行の後に印刷されます。
- stream
- この行のタイプは、 --verbose が指定されたときのみ使用されます。 .xz ファイルのストリームがあるように多くの stream 行があります。
- block
- この行のタイプは、 --verbose が指定されたときのみ使用されます。 .xz ファイルのブロックがあるように多くの block 行があります。 block 行は、すべての stream 行の後に表示されます。異なった行のタイプは、挟まれません。
- summary
- この行のタイプは、 --verbose が指定されたときのみ使用されます。この行は、すべての block 行の後に印刷されます。 file 行のように、 summary 行は、 .xz ファイルに関する全般的な情報を含んでいます。
- totals
- この行は、常にリスト出力のまさしく最後の行です。合計のカウントとサイズを表示します。
file 行のカラムは、次の通りです:
- 2.
- ファイルのストリーム数。
- 3.
- (複数の) ストリームのブロックの合計数。
- 4.
- ファイルの圧縮サイズ。
- 5.
- ファイルの復元されたサイズ。
- 6.
- 圧縮比、例えば、 0.123。比率が 9.999 以上であるなら、3 つのダッシュ ( ---) が比率の代わりに表示されます。
- 7.
- 整合性チェック名のコンマで区切られたリスト。次の文字列は、知られているチェックタイプのために使用されます: None, CRC32, CRC64 と SHA-256 です。未知のチェックタイプについて、 Unknown- N が使用されます、ここで N は、10 進数 (1 または 2 桁) の Check ID です。
- 8.
- ファイルのストリームの詰め物の合計サイズ。
stream 行のカラムは、次の通りです:
- 2.
- ストリーム番号 (最初のストリームは、1 です)。
- 3.
- ストリームのブロックの数。
- 4.
- 圧縮された始めたオフセット。
- 5.
- 復元された始めがオフセット。
- 6.
- 圧縮サイズ (ストリームの詰め物を含みません)。
- 7.
- 復元されたサイズ。
- 8.
- 圧縮比。
- 9.
- 成功性チェックの名前。
- 10.
- ストリームの詰め物のサイズ。
block 行のカラムは、次の通りです:
- 2.
- このブロックを含むストリームの数。
- 3.
- ストリームの始まりに相対的なブロックの数 (最初のブロックは、1 です)。
- 4.
- ファイルの始まりに相対的なブロックの数。
- 5.
- ファイルの始まりに相対的な圧縮され始めたオフセット。
- 6.
- ファイルの始まりに相対的な復元され始めたオフセット。
- 7.
- (ヘッダを含む) ブロックの合計圧縮サイズ。
- 8.
- 復元されたサイズ。
- 9.
- 圧縮比。
- 10.
- 整合性チェックの名前。
--verbose が 2 度指定されるなら、追加カラムは、 block 行に含まれます。この情報を得ることが、多くをシークを必要し、従って、遅くなるかもしれないので、これらは、単一の --verbose で表示されません:
- 11.
- 16 進の整合性チェックの値。
- 12.
- ブロックヘッダサイズ。
- 13.
- ブロックフラグ: c は、圧縮されたサイズが存在していることを示し、 u は、復元されたサイズが存在していることを示します。フラグが設定されないなら、ダッシュ ( -) は、一定の文字列長を保持する代わりに表示されます。新しいフラグは、将来、文字列の終りに追加されるかもしれません。
- 14.
- (ブロックヘッダ、ブロックの詰め物とチェックフィールドを除く) ブロックの実際の圧縮されたデータのサイズ。
- 15.
- メモリ容量 (バイト単位の) は、この xz バージョンで、このブロックを復元することが必要です。
- 16.
- フィルタチェーン。復元に必要なオプションだけが、 .xz ヘッダに格納されるので、圧縮時に使用されたオプションのほとんどは、知ることができないことに注意してください。
summary 行のカラムは、次の通りです:
- 2.
- この xz バージョンで、このファイルを圧縮復元するために必要なメモリの量 (バイト単位)。
- 3.
- yes または no は、すべてのブロックのヘッダに格納された圧縮されたサイズと圧縮されていないサイズの両方があるかどうかを示します。
totals 行のカラムは、次の通りです:
- 2.
- ストリームの数。
- 3.
- ブロックの数。
- 4.
- 圧縮サイズ。
- 5.
- 復元されたサイズ。
- 6.
- 平均の圧縮比。
- 7.
- ファイルに存在している整合性チェック名のコンマで区切られたリスト。
- 8.
- ストリームの詰め物のサイズ。
- 9.
- ファイルの数。これは、 file 行でのように初期のカラムの順序を同じに保つために、ここにあります。
--verbose が 2 度指定されるなら、追加カラムは、 totals 行に含まれます。
- 10.
- メモリ容量 (バイト単位の) は、この xz バージョンで、ファイルを復元することが必要です。
- 11.
- すべてのブロックヘッダには、それらに格納された圧縮されたサイズと復元されたサイズの両方があるなら、 yes または no を示します。
将来のバージョンは、新しい行のタイプを追加し、既存の行のタイプに新しいカラムを追加することができますが、既存のカラムは、変更されないでしょう。
終了ステータス
- 0
- すべて良好です。
- 1
- エラーが発生しました。
- 2
- 何か警告相当のものが起こりましたが、実際のエラーは起こりませんでした。
標準エラーに印刷された通知 (警告でないか、またはエラー) は、終了ステータスに影響しません。
環境変数
xz は、コマンドラインからのオプションを解析する前に、環境変数 XZ_DEFAULTS と XZ_OPT の順序で、空白で区切られたオプションのリストを解析します。オプションだけが環境変数から解析されることに注意してください。すべてのオプションでないものは、静かに無視されます。解析は、コマンドライン引数にも使用される getopt_long(3) で行われます。- XZ_DEFAULTS
- ユーザ特有、またはシステム全体のデフォルトのオプション。通常、これは、デフォルトで、 xz のメモリ使用量のリミッタ (limiter) を有効にするためにシェルの初期化スクリプトで設定されます。シェルの初期化スクリプトと同様の特別な場合を除いて、スクリプトは、 XZ_DEFAULTS を決して設定したり、設定を取り消し (unset) たりしてはいけません。
- XZ_OPT
- これは、直接 xz コマンドラインでオプションを設定することができないとき、 xz にオプションを渡すためのものです。これは、例えば、 xz がスクリプトまたはツール、例えば、GNU tar(1)、によって実行されるときの場合です:
XZ_OPT=-2v tar caf foo.tar.xz foo
-
- スクリプトは、例えば、スクリプト特有のデフォルトの圧縮オプションを設定するために、 XZ_OPT を使用できます。ユーザが XZ_OPT を上書きすることが妥当である、例えば、 sh(1) スクリプトで、次のように使用するかもしれないなら、上書きすることは、まだ勧められます。
XZ_OPT=${XZ_OPT-"-7e"}
export XZ_OPT
LZMA ユーティリティの互換性
xz のコマンドラインの構文は、LZMA Utils 4.32.x から分かるように、実際に lzma, unlzma と lzcat のスーパセットです。ほとんどの場合、既存のスクリプトを壊すことなしに LZMA Utils を XZ Utils に置き換えるることが可能です。時々問題を起こすかもしれない、いくつかの互換性のないこともあります。圧縮プリセットレベル
レベルがあらかじめセットする圧縮レベルのプリセットの番号付けは、 xz と LZMA Utils で同じではありません。最も重要な違いは、辞書サイズが異なるプリセットにどのようにマップされるかということです。辞書サイズは、復元プログラムのメモリ使用量とほぼ同等です。レベル | xz | LZMA Utils |
-0 | 256 KiB | N/A |
-1 | 1 MiB | 64 KiB |
-2 | 2 MiB | 1 MiB |
-3 | 4 MiB | 512 KiB |
-4 | 4 MiB | 1 MiB |
-5 | 8 MiB | 2 MiB |
-6 | 8 MiB | 4 MiB |
-7 | 16 MiB | 8 MiB |
-8 | 32 MiB | 16 MiB |
-9 | 64 MiB | 32 MiB |
辞書サイズの差は、圧縮プログラムのメモリ使用量にも影響しますが、違いをさらに大きくする LZMA Utils と XZ Utils の間の他の違いもあります:
レベル | xz | LZMA Utils 4.32.x |
-0 | 3 MiB | N/A |
-1 | 9 MiB | 2 MiB |
-2 | 17 MiB | 12 MiB |
-3 | 32 MiB | 12 MiB |
-4 | 48 MiB | 16 MiB |
-5 | 94 MiB | 26 MiB |
-6 | 94 MiB | 45 MiB |
-7 | 186 MiB | 83 MiB |
-8 | 370 MiB | 159 MiB |
-9 | 674 MiB | 311 MiB |
LZMA Utils のデフォルトのプリセットレベルは、 -7 ですが一方、XZ Utils では、 -6 であるので、両方がデフォルトで 8 MiB の辞書を使用します。
ストリーム対非ストリームの .lzma ファイル
.lzma ヘッダにファイルの復元されたサイズを格納することができます。 LZMA Utils は、通常ファイルを圧縮するとき、それを行います。代替手段は、復元されたサイズが未知であることをマークすることであり、復元プログラムが停止するべきであるところを示すペイロードの終り (end-of-payload) マーカを使用します。 LZMA Utils は、(例えば、パイプの場合のように) 復元されるサイズが知られていないとき、この方法を使用します。xz は、ペイロードの終りマーカのあるなしにかかわらず .lzma ファイルの復元をサポートしますが、 xz によって作成されたすべての .lzma ファイルは、ペイロードの終りマーカを使用し、 .lzma ヘッダに未知であるとマークされた復元されるサイズがあります。これは、いくつかの珍しいの状況の問題であるかもしれません。例えば、組み込みデバイスの .lzma 復元プログラムは、復元されたサイズを知っているファイルでのみ動作するかもしれません。この問題にぶつかるなら、利用者は、知られている復元されたサイズで .lzma ファイルを作成するために LZMA Utils または LZMA SDK を使用する必要があります。
サポートされない .lzma ファイル
.lzma 形式は、最大 8 までの lc 値と最大 4 までの lp 値を許可しています。 LZMA Utils は、任意の lc と lp でファイルを復元できますが、常に lc=3 と lp=0 でファイルを作成します。他の lc と lp でファイルを作成することは、 xz と LZMA SDK で可能です。liblzma の LZMA1 フィルタの実装は、 lc と lp の合計が 4 を超えてはならないことを必要とします。したがって、この制限を超えている、 .lzma ファイルを xz で復元することはできません。
LZMA Utils は、 2^ n (2 のべき乗) の辞書サイズがある .lzma ファイルのみを作成しますが、どんな辞書サイズのファイルも受け付けます。 liblzma は、 2^ n または 2^ n + 2^( n-1). の辞書サイズがある .lzma ファイルのみを受け付けます。これは、 .lzma ファイルを検出するとき、誤検出を減少させるためのです。
これらの制限は、実際にすべての .lzma ファイルが liblzma が受け付ける設定で圧縮されているので、実際のところは問題とはならないはずです。
後続するガーベージ
復元するとき、LZMA Utils は、最初の .lzma ストリームの後で静かにすべてを無視します。ほとんどの状況で、これは、バグです。また、これは、LZMA Utils が、連結された .lzma ファイルの復元をサポートしてないことを意味します。最初の .lzma ストリームの後に残っているデータがあるなら、 xz は、ファイルが間違っていると見なします。これは、後続するガーベージが無視されると仮定した不鮮明なスクリプトを中断するかもしれません。
注
圧縮された出力が異なるかもしれない
同じ復元された入力ファイルから生産された正確な圧縮された出力は、圧縮オプションが同じであっても、XZ Utils バージョンで異なるかもしれません。これは、ファイル形式に影響せずにエンコーダを改良 (より速いか、またはより良い圧縮) することができるからです。出力は、異なった構築オプションが使用されているなら、同じ XZ Utils バージョンの異なった構築の間でさえ異なるかもしれません。上記は、rsync 可能な .xz ファイルを作成するために --rsyncable を実装することは、次に --rsyncable と共に使用できるエンコーダの実装の一部をフリーズせずに、起こらないことを意味します。
組み込み .xz 復元プログラム
組み込み .xz 復元プログラムは、XZ 組み込みが必ずしも none と crc32 以外の整合性 check タイプで作成されたファイルをサポートするとはいえないように、実装されています。デフォルトが --check=crc64 であるので、組み込みシステムのためのファイルを作成するとき、利用者は、 --check=none または --check=crc32 を使用しなければなりません。組み込まれたシステムの外では、すべての .xz 形式の復元プログラムは、すべての check タイプをサポートするか、または少なくとも特定の check がサポートされないなら、整合性チェックを確認せずに、ファイルを復元できます。
XZ Embedded は、BCJ フィルタをサポートしますが、デフォルトでオフセットを開始するだけです。
使用例
基本
デフォルトの圧縮レベル ( -6) を使用して、ファイル foo を foo.xz に圧縮し、圧縮が成功するなら、 foo を削除します:
xz foo
bar.xz を bar に復元し、復元が成功しても、 bar.xz を削除しません:
xz -dk bar.xz
デフォルトより遅い、プリセット -4e ( -4 --extreme) で baz.tar.xz を作成します、例えば、デフォルトは、 -6 ですが、圧縮と復元 (それぞれ、48 MiB と 5 MiB) のためにより少ないメモリで済みます:
tar cf - baz | xz -4e > baz.tar.xz
単一のコマンドで標準出力に、圧縮されたものと復元されたものが混合されたファイルを復元することができます:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
多くのファイルの並列圧縮
GNU と *BSD では、多くのファイルの並列の圧縮のために find(1) と xargs(1) を使用することできます:
find . -type f \! -name '*.xz' -print0 \
| xargs -0r -P4 -n16 xz -T1
xargs(1) への -P オプションは、並列な xz プロセスの数を設定します。 -n オプションのための最も良い値は、どのくらい多くの圧縮されるファイルがあるかに依存します。 2 つのファイルしかないなら、値は、たぶん 1 であるべきです。何万ものファイルで、 xargs(1) が結局は作成する xz プロセスの数を減少させることは、100 以上も適切であるかもしれません。
xargs(1) は、並列化の量を制御するために使用されるので、 xz のためのオプション -T1 は、単一のスレッド化されたモードに強制するためにあります。
ロボットモード
複数のファイルを圧縮した後に、合計でどのくらいのバイトが節約されたかを計算します:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
スクリプトは、十分に新しい xz を使用していることを知りたいかもしれません。次の sh(1) スクリプトは、 xz ツールのバージョン番号が少なくとも 5.0.0 であるかチェックします。このメソッドは、 --robot オプションをサポートしなかった、古いベータバージョンと互換性があります。
if ! eval "$(xz --robot --version 2> /dev/null)" ||
[ "$XZ_VERSION"-lt 50000002 ]; then
echo "Your xz is too old."
fi
unset XZ_VERSION LIBLZMA_VERSION
XZ_OPT を使用して、復元のためのメモリ使用量の制限を設定しますが、制限が既に設定されていたなら、それを増加しません:
NEWLIM=$((123 << 20)) # 123 MiB
OLDLIM=$(xz --robot --info-memory | cut -f3)
if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then
XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM"
export XZ_OPT
fi
カスタム圧縮フィルタチェーン
カスタムフィルタチェーンの最も簡単な使用は、 LZMA2 プリセットをカスタマイズすることです。プリセットが、圧縮設定の潜在的に役に立つ組み合わせのサブセットだけをカバーするので、これが役に立つ場合があります。オプション -0 ... -9 と --extreme の記述からテーブルの CompCPU カラムは、LZMA2 プリセットをカスタマイズするとき、役に立ちます。ここに、それらの 2 つのテーブルから集められた関連する部分を示します:
プリセット | CompCPU |
-0 | 0 |
-1 | 1 |
-2 | 2 |
-3 | 3 |
-4 | 4 |
-5 | 5 |
-6 | 6 |
-5e | 7 |
-6e | 8 |
ファイルが、うまく圧縮するために、いくらか大きな辞書 (例えば、32 MiB) を必要としますが、 xz -8 が行うだろうより迅速にそれを圧縮したいことを、利用者が知っているなら、さらに大きい辞書を使用するために、低い CompCPU 値 (例えば、1) があるプリセットを変更することができます。
xz --lzma2=preset=1,dict=32MiB foo.tar
特定のファイルで、上記のコマンドは、かなりより良い圧縮している、 xz -6 より速いかもしれません。しかしながら、いくつかのファイルだけが利益を得ることが強調されなければなりません。大きな辞書が大いに役立つことができる、最も明白な状況は、それぞれ少なくとも数メガバイトのよく似たファイルを含むアーカイブです。辞書サイズは、LZMA2 が連続したファイルの間の類似性を最大限に活用することができる任意の個別のファイルよりもかなり大きくなければなりません。
非常に高い圧縮プログラムと復元プログラムのメモリ使用量がすばらしく、圧縮されるファイルが、少なくとも数 100 メガバイトであるなら、 xz -9 が使用する 64 MiB よりさらに大きい辞書を使用することが役に立ちます:
xz -vv --lzma2=dict=192MiB big_foo.tar
上記の例のような -vv ( --verbose --verbose) の使用は、圧縮プログラムと復元プログラムの必要なメモリを見るために役に立つかもしれません。復元されたファイルのサイズより大きな辞書を使用することは、メモリの浪費であるので、上記のコマンドは、小さなファイルに役に立たないことを覚えておいてください。
時々、圧縮時間は、重要ではありませんが、復元プログラムのメモリ使用量は、例えば、組込みシステムでファイルを復元することを可能にするように、低く保持されなければなりません。次のコマンドは、ベースとして -6e ( -6 --extreme) を使用して、辞書を 64 KiB だけに設定します。約 100 KiB のメモリを使用する XZ Embedded (すなわち、 --check=crc32 がある理由) で結果のファイルを復元することができます。
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
できるだけ多くのバイトを絞り出したいなら、リテラルのコンテキストのビットの数 ( lc) と位置のビット数 ( pb) を調整することは、時々役に立つかもしれません。リテラルの位置のビットの数 ( lp) を調整することも役にたつかもしれませんが、通常、 lc と pb は、より重要です。例えば、ソースコードのアーカイブは、ほとんどの US-ASCII テキストを含んでいるので、次のようなものは、(また、 lc=4 なしで試みる) xz -6e よりわずかに (like 0.1 %) 小さいファイルを与えるかもしれません:
xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar
LZMA2 で別のフィルタを使用すると、特定のファイルのタイプで圧縮を改良することができます。例えば、x86 BCJ フィルタを使用して x86-32 または x86-64 共有ライブラリを圧縮するためには:
xz --x86 --lzma2 libfoo.so
フィルタオプションの順序がが重要であることに注意してください。 --x86 が --lzma2 の後に指定されるなら、LZMA2 の後に、フィルタがあるはずがないので、また、チェーンの最後のフィルタのように、x86 BCJ フィルタを使用することができないので、 xz は、エラーとなります。
LZMA2 とともに Delta フィルタは、ビットマップイメージで良い結果を与えることができます。通常、簡単なデルタよりもう少しの高度なフィルタがある PNG を打ち負かすべきですが、実際の圧縮ために Deflate を使用します。
イメージは、例えば、復元された TIFF のような、復元された形式で保存されなければなりません。 Delta フィルタの距離パラメータは、イメージで 1 ピクセルごとのバイト数にマッチするように設定されます。例えば、24 ビットの RGB ビットマップは、 dist=3 を必要とし、また、3 バイトの整列に対応するために LZMA2 に pb=0 を渡すことは良いことです:
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
複数のイメージが単一のアーカイブ (例えば、 .tar) に入れられたなら、Delta フィルタは、すべてのイメージに 1 ピクセルごとに同じバイト数がある限り、それでも動作します。
関連項目
xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)XZ Utils: <http://tukaani.org/xz/>
XZ Embedded: <http://tukaani.org/xz/embedded.html>
LZMA SDK: <http://7-zip.org/sdk.html>
2012-05-27 | Tukaani |