web-dev-qa-db-ja.com

7zで圧縮方法を組み合わせると実際に何ができますか?

7zコマンドラインツール 複数の圧縮方法を指定できます 例:

# 7-Zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

すべてのメソッドは何らかの方法で使用されるか、少なくともメタデータで指定されます。

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

notは、3つの方法すべてでファイルを実行し、最適な方法を選択しているように見えます。むしろ、メソッドの順序を変更するとファイルサイズに大きな影響を与えるため、常に最初のものを選択するようです。

1つのXMLファイル(PPMdが最適な圧縮を生成)と1つのバイナリファイル(LZMA2が生成)など、複数のファイルを追加しても、両方のファイルのすべてのメソッドが一覧表示され、ファイルごとに動的に切り替わるようには見えません。

実際、ドキュメントには「メソッドはいくつでも使用できます」と明記されていますが、whereforeとは記載されていません。

私が達成しようとしているのは、ファイルごとの「複数の方法を試し、最適な方法を選択する」アーカイブです。もちろん、少しのスクリプトで手動でこれを実現できますが、おそらく、圧縮メソッドを連鎖させることでそれを正確に実行できるでしょうか?

11
Sören Kuklau

一般に、圧縮されたデータは(さらに)効率的に圧縮することはできません。最初の圧縮方法を適用した後は、ファイルサイズを大幅に減らすことはできません。

-mN=Xは主にフィルターを指定するためのものです(Windowsヘルプファイルから取得):

サポートされているフィルター:

Deltaデルタフィルター(「デルタオフセットをバイト単位で設定できます。たとえば、16ビットステレオWAVファイルを圧縮するには、「0 = Delta:4」を設定できます。デフォルトのデルタオフセットは1です。 」)

[〜#〜] bcj [〜#〜] x86実行可能ファイル用のコンバーター

BCJ2 x86実行可能ファイル(バージョン2)用のコンバーター(「BCJ2は32ビットx86実行可能ファイル(バージョン2)用の分岐コンバーターです。さらに圧縮を増やすためにいくつかの分岐命令を変換します。」)

[〜#〜] arm [〜#〜] ARM(リトルエンディアン)実行可能ファイル用のコンバーター

[〜#〜] armt [〜#〜] ARM Thumb(リトルエンディアン)実行可能ファイル用のコンバーター

IA64 IA-64実行可能ファイル用のコンバーター

[〜#〜] ppc [〜#〜] PowerPC(ビッグエンディアン)実行可能ファイル用のコンバーター

[〜#〜] sparc [〜#〜]コンバーターSPARC実行可能ファイル

また、ヘルプファイルから、BCJ2フィルターの複数の出力ストリームを活用する高度な例:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

bCJ2コンバーターを使用して* .exeおよび* .dllファイルをアーカイブarchive.7zに追加し、メイン出力ストリーム(s0)用に8 MBディクショナリを備えたLZMA、およびBCJ2のs1およびs2出力ストリーム用に512KBディクショナリを備えたLZMAを追加します。

5
Daniel B

フィルタを順番に適用できるようです。

昨年のこの投稿には素晴らしい説明があります:

7-Zipの-mスイッチの後の数字はどういう意味ですか?

この番号を使用すると、一度に複数を使用する場合に圧縮操作の順序を設定できます。

これはドキュメントの例です。

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

* .exeファイルと* .dllファイルを追加して、BCJ2フィルターを使用してa.7zをアーカイブし、メイン出力ストリーム(s0)用に32 MBディクショナリを備えたLZMA、およびBCJ2のs1およびs2出力ストリーム用に512KBディクショナリを備えたLZMAを追加します。

最初の圧縮は最小の数値であり、ゼロです。この例では、ゼロがBCJ2に設定されています。次に、LZMAが登場します。 2と3もLZMAですが、異なるdパラメーターを使用しています。

-mbオプションは、ある圧縮からの出力を別の圧縮の入力に「バインド」するために使用されます。この例では、BCJ2には1つの入力と4つの出力があります。出力ゼロは圧縮番号1になります。出力1は圧縮番号2になります。出力2は圧縮番号3に送られます。出力3はバインドされていません(再度圧縮する必要がないため)。

2
Marcelo