我有一个被分成几个文件的大型压缩包。 压缩包是 100GB 拆分为 12GB 文件。
tar czf - -T myDirList.txt | split --bytes=12GB - my.tar.gz.
尝试cat my.tar.gz.* | gzip -l
退货
compressed uncompressed ratio uncompressed_name
-1 -1 0.0% stdout
尝试gzip -l my.tar.gz.aa
退货
compressed uncompressed ratio uncompressed_name
12000000000 3488460670 -244.0% my.tar
连接文件cat my.tar.gz.* > my.tar.gz
返回甚至更糟糕的答案
compressed uncompressed ratio uncompressed_name
103614559077 2375907328 -4261.1% my.tar
这是怎么回事? 如何获得这些分体式压缩包的实际压缩比?
gzip 格式将未压缩的大小存储为流的最后四个字节。 gzip -l
使用这四个字节和 gzip 文件的长度来计算压缩率。在这样做时,gzip 会寻求输入的末尾以获取最后四个字节。请注意,四个字节最多只能表示 4 GB - 1。
在第一种情况下,您无法在管道输入上查找,因此 gzip 放弃并报告 -1。
在第二种情况下,gzip 将拾取四个字节的压缩数据,实际上是四个随机字节,作为未压缩的大小,它必然小于 12,000,000,000,因此报告了负压缩率(扩展(。
在第三种情况下,gzip 获得实际的未压缩长度,但该长度模 232,必然远小于 103 GB,报告了更显着的负压缩率。
第二种情况是没有希望的,但第一种和第三种情况的压缩率可以使用 pigz 来确定,pigz 是 gzip 的并行实现,使用多个内核进行压缩。 pigz -lt
解压缩输入而不存储它,以便直接确定未压缩字节数。(pigz -l
就像gzip -l
一样,也行不通。您需要测试t
,即解压缩而不保存。