我有一个很大的bzip2压缩文件,我需要检查它的解压缩大小而不实际解压缩它(类似于gzip -l file.gz或xz -l file.xz)。这如何使用bzip2?
就像评论和链接答案中提到的那样,唯一可靠的方法是解压缩(在管道中)并进行字节计数。
$ bzcat file.bz2 | wc -c
1234
Run Code Online (Sandbox Code Playgroud)
或者找到一些没有多余管道的工具(可能会更有效):
$ 7z t file.bz2
[...]
Everything is Ok
Size: 1234
Run Code Online (Sandbox Code Playgroud)
这也适用于 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
Run Code Online (Sandbox Code Playgroud)
或者,如果文件被连接或根本没有正确创建:
$ 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
Run Code Online (Sandbox Code Playgroud)
大小不匹配所以这在任何方面都不可靠。
有时您可以作弊,这取决于档案中的内容。例如,如果它是一个压缩的文件系统映像,开头带有元数据头,您可以只解压缩该头,然后从中读取总文件系统大小。
$ 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
Run Code Online (Sandbox Code Playgroud)
因此,通过提取一小部分,您可以了解到这是 315904 个 4096 字节的块,即 1234 MiB。
不能保证压缩文件的实际大小(它可能更大或更小),但假设没有奇怪的东西,它比gzip -l任何情况下都更值得信赖。
最后但并非最不重要的是,如果这些文件是您首先创建的,只需记录大小。
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |