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

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

请查看我的操作系统详细信息:

$ 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

回答问题标题:

如何在不实际解压缩 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

答案2

我喜欢使用,pv因为它显示更人性化可读的信息和进度:

zcat file.gz | pv > /dev/null

输出:

7,65GiB 0:00:44 [ 174MiB/s] [

答案3

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

gzcat mycontent.DAT.Gz | LC_ALL=C wc -c
gzip -dc mycontent.DAT.Gz | LC_ALL=C wc -c

答案4

我在网上找到了所有网站,但都没有解决文件大小大于 4GB 时获取大小的问题。

我的解决方案是这样的

[oracle@base tmp]$ timeout --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

相关内容