Compression
bzip2:檢查文件的解壓縮大小而不實際解壓縮它
我有一個很大的
bzip2
壓縮文件,我需要檢查它的解壓縮大小而不實際解壓縮它(類似於gzip -l file.gz
orxz -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
任何情況下都更值得信賴。最後但並非最不重要的一點是,如果這些文件是您首先創建的,只需記錄大小。