Compression

bzip2:檢查文件的解壓縮大小而不實際解壓縮它

  • October 12, 2019

我有一個很大的bzip2壓縮文件,我需要檢查它的解壓縮大小而不實際解壓縮它(類似於gzip -l file.gzor xz -l file.xz)。如何做到這一點bzip2

就像評論和連結答案中提到的那樣,唯一可靠的方法是解壓縮(在管道中)並進行字節計數。

$ 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 字節的塊,即 1234 MiB。

無法保證壓縮文件的實際大小(可能更大或更小),但假設沒有奇怪的東西,它比gzip -l任何情況下都更值得信賴。

最後但並非最不重要的一點是,如果這些文件是您首先創建的,只需記錄大小。

引用自:https://unix.stackexchange.com/questions/546465