manifestor Asked: 2019-10-13 03:22:39 +0800 CST2019-10-13 03:22:39 +0800 CST 2019-10-13 03:22:39 +0800 CST bzip2:检查文件的解压缩大小而不实际解压缩它 772 我有一个很大的bzip2压缩文件,我需要检查它的解压缩大小而不实际解压缩它(类似于gzip -l file.gzor xz -l file.xz)。如何做到这一点bzip2? compression 2 个回答 Voted Best Answer frostschutz 2019-10-13T05:40:24+08:002019-10-13T05:40:24+08:00 就像评论和链接答案中提到的那样,唯一可靠的方法是解压缩(在管道中)并进行字节计数。 $ 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任何情况下都更值得信赖。 最后但并非最不重要的一点是,如果这些文件是您首先创建的,只需记录大小。 NATI0N 2019-10-13T04:27:46+08:002019-10-13T04:27:46+08:00 这个问题已经在这里回答了。贴在下面: 正如其他人所指出的, 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
就像评论和链接答案中提到的那样,唯一可靠的方法是解压缩(在管道中)并进行字节计数。
或者找到一些没有多余管道的工具(可能会更有效):
这也适用于 gzip 和其他格式。虽然
gzip -l file.gz
打印了一个尺寸,但它可能是错误的结果。文件超过一定大小后,您会得到以下内容:或者如果文件被连接或根本没有正确创建:
大小不匹配,所以这在任何方面都不可靠。
有时您可以作弊,具体取决于存档中的内容。例如,如果它是一个压缩的文件系统映像,开头有一个元数据标头,您可以只解压缩该标头,然后从中读取文件系统的总大小。
因此,通过提取一小部分,您了解到这是 315904 个 4096 字节的块,即 1234 MiB。
无法保证压缩文件的实际大小(可能更大或更小),但假设没有奇怪的东西,它比
gzip -l
任何情况下都更值得信赖。最后但并非最不重要的一点是,如果这些文件是您首先创建的,只需记录大小。
这个问题已经在这里回答了。贴在下面:
正如其他人所指出的, bzip2 没有提供太多信息。但这种技术有效——您必须解压缩文件,但不必将解压缩的数据写入磁盘,这对您来说可能是一个“足够好”的解决方案:
您可以将该输出通过管道传输到其他内容中,以提供人类可读的形式: