大きな圧縮ファイルがあり、bzip2
実際に解凍せずに解凍されたサイズを確認する必要があります(gzip -l file.gz
または同様xz -l file.xz
)。これを達成するためにどのように使用しますかbzip2
?
答え1
コメントに関連付けられた回答で述べたように、信頼できる唯一の方法は(パイプで)解凍してバイト数を計算することです。
$ bzcat file.bz2 | wc -c
1234
または、不要な配管なしでこれを行うツールを見つけます(もう少し効率的かもしれません)。
$ 7z t file.bz2
[...]
Everything is Ok
Size: 1234
これはgzipやその他の形式でも機能します。gzip -l file.gz
寸法は印刷されていますが、誤った結果が出ることがあります。ファイルが特定のサイズを超えると、次の結果が表示されます。
$ gzip --list foobar.gz
compressed uncompressed ratio uncompressed_name
97894400 58835168 -66.4% foobar
$ gzip --list foobar.gz
compressed uncompressed ratio uncompressed_name
4796137936 0 0.0% foobar
または、ファイルがリンクされているか、まったく正しく生成されていない場合:
$ truncate -s 1234 foobar
$ gzip foobar
$ cat foobar.gz foobar.gz > barfoo.gz
$ gzip -l barfoo.gz
compressed uncompressed ratio uncompressed_name
74 1234 96.0% barfoo
$ zcat barfoo.gz | wc -c
2468
寸法が一致しないため、とにかく信頼できません。
時にはプロフィールの内容に応じて不正行為をすることもあります。たとえば、圧縮ファイルシステムイメージで、先頭にメタデータヘッダーがある場合は、そのヘッダーを解凍してファイルシステムの全体サイズを読み取ることができます。
$ truncate -s 1234M foobar.img
$ mkfs.ext2 foobar.img
$ bzip2 foobar.img
$ bzcat foobar.img.bz2 | head -c 1M > header.img
$ tune2fs -l header.img
tune2fs 1.45.4 (23-Sep-2019)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 95b64880-c4a7-4bea-9b63-6fdcc86d0914
[...]
Block count: 315904
Block size: 4096
したがって、小さな部分を抽出すると、315904 4096バイトのブロック、つまり1234MiBであることがわかります。
圧縮されたファイルの実際のサイズの保証はありませんが(大きくても小さくても)、奇妙なことはないと仮定すると、gzip -l
何よりも信頼できます。
最後に、これらのファイルを最初に作成した場合は、サイズだけを記録してください。
答え2
この質問にはすでに答えがあります。ここ。次のように貼り付けます。
他の人が指摘したように、bzip2は多くの情報を提供しません。しかし、この技術は効果があります。ファイルを解凍する必要がありますが、解凍したデータをディスクに書き込む必要はありません。これは「十分に良い」ソリューションです。
$ ls -l foo.bz2
-rw-r--r-- 1 ~quack ~quack 2364418 Jul 4 11:15 foo.bz2
$ bzcat foo.bz2 | wc -c # bzcat decompresses to stdout, wc -c counts bytes
2928640 # number of bytes of decompressed data
この出力を別のものにパイプして、人間が読める形式を提供できます。
$ ls -lh foo.bz2
-rw-r--r-- 1 quack quack 2.3M Jul 4 11:15 foo.bz2
$ bzcat foo.bz2 | wc -c | perl -lne 'printf("%.2fM\n", $_/1024/1024)'
2.79M