如何在不实际解压缩的情况下获得gzip文件的未压缩大小?


25

请找到我的操作系统详细信息:

$ uname -a
AIX xxyy 1 6 000145364C00

我尝试了以下命令来获取gzip存档中文件的大小:

$ gzip -l mycontent.DAT.Gz
compressed  uncompr.   ratio   uncompressed_name
-1223644243 1751372002 -75.3%  mycontent.DAT.Gz

不确定如何从中解压缩大小。压缩文件大小接近4 GB。

因此,我尝试了此选项以捕获正确的数据:

$ zcat mycontent.DAT.Gz | wc -c

它给了我这个错误:

mycontent.DAT.Gz.Z:A file or directory in the path name does not exist.
0

您能告诉我如何在不解压缩源文件的情况下从shell脚本中捕获此值吗?


您确定档案的完整性吗?它报告自己的压缩大小为〜1.7G。如果确实是〜4GB,我想可能是个问题。
terdon

Answers:


26

回答问题标题:

如何在不实际解压缩的情况下获得gzip文件的未压缩大小?

如您所知,选项-l--list)通常显示未压缩的大小。
它显示的内容不是根据数据计算得出的,而是作为压缩文件的一部分存储在标头中的。

在您的情况下,该-l选项由于某些原因而无效。
但是不可能从原始压缩数据中“测量”未压缩的大小-压缩数据中没有关于其他任何内容的信息-这不足为奇,因为压缩的重点是遗漏了不需要的任何内容。

您不需要将未压缩的数据存储在磁盘上:这zcat file.gz | wc -c是正确的方法-但正如@OleTange回答的那样,您zcat似乎不是的人gzip
另一种方法是使用gzip选项-d--decompress)和-c--to-stdout),并结合wc选项-c--bytes):

gzip -dc file.gz | wc -c

13
-l选项对于大于4GB的文件存在的问题:bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Flimm

6

zcat不是GNU zcat,而是来自compress。尝试:

gzcat mycontent.DAT.Gz | wc -c
gzip -dc mycontent.DAT.Gz | wc -c

这将解压缩源文件。也许这就是OP想要的,但这并不是问题的答案。
Marco Marco

啊,这解释了为什么它要寻找以.Z结尾的文件
Hennes

0

gzip -l对我不起作用,只是git -1 ...但是这样做:

unzip -l file.zip

0

我正在网上找到所有站点,并且当文件大小大于4GB时无法解决此问题。

我的解决方案是这样的

[oracle @ base tmp] $超时--signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz
    -rw-r--r-- oracle / oinstall 111828 2018-03-03 03:05 oracle.20180303.030001.log
    -rw-r ----- oracle / oinstall 6666911744 2018-03-03 03:05 oracle.20180303.030001.dmp

用于从gz文件获取总大小:

[oracle @ base tmp] $ echo $(timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk'{print $ 3}')| grep -o'[[:digit:]] *'| awk'{sum + = $ 1} END {print sum}'
    6667023572

1
如果您解释说它仅适用于tarball,并且已将其清理干净(不需要超时,也不需要grep),则这将是一个更好的答案。
kbolino
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.