我有一个大型tarball,它被分成几个文件。 tarball是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
这里发生了什么?如何获得这些拆分tarball的实际压缩比?
答案 0 :(得分:1)
gzip格式将未压缩的大小存储为流的最后四个字节。 gzip -l
使用这四个字节和gzip文件的长度来计算压缩率。在这样做时,gzip寻求输入的结尾以获得最后四个字节。请注意,四个字节最多只能表示4 GB - 1。
在您的第一种情况下,您无法搜索管道输入,因此gzip会放弃并报告-1。
在你的第二种情况下,gzip正在拾取四个字节的压缩数据,实际上是四个随机字节,作为未压缩的大小,必须小于12,000,000,000,因此报告负压缩比(扩展)。
在你的第三种情况下,gzip正在获得实际的未压缩长度,但该模块的长度为2 32 ,这必然远小于103 GB,报告的更多显着的负压缩比。
第二种情况是没有希望的,但第一种和第三种情况的压缩率可以使用pigz来确定,http://www.jqueryscript.net/demo/Smart-jQuery-Pan-Zoom-Plugin-Smart-jQuery-Zoom/example/是使用多个核进行压缩的gzip的并行实现。 pigz -lt
解压缩输入而不存储它,以便直接确定未压缩字节的数量。 (pigz -l
就像gzip -l
一样,也不会工作。您需要t
进行测试,即无需保存即可解压缩。)