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

use*_*010 38 unix shell gzip gz

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

$ uname -a
AIX xxyy 1 6 000145364C00
Run Code Online (Sandbox Code Playgroud)

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

$ gzip -l mycontent.DAT.Gz
compressed  uncompr.   ratio   uncompressed_name
-1223644243 1751372002 -75.3%  mycontent.DAT.Gz
Run Code Online (Sandbox Code Playgroud)

不知道如何解释解压后的大小。压缩文件大小接近 4 GB。

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

$ zcat mycontent.DAT.Gz | wc -c
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

mycontent.DAT.Gz.Z:A file or directory in the path name does not exist.
0
Run Code Online (Sandbox Code Playgroud)

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

Vol*_*gel 37

回答问题标题:

如何在不实际解压缩的情况下获得 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
Run Code Online (Sandbox Code Playgroud)

  • `-l` 选项对于大于 4GB 的文件有一个错误:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775 (19认同)

Edu*_*rdo 11

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

zcat file.gz | pv > /dev/null
Run Code Online (Sandbox Code Playgroud)

输出:

7,65GiB 0:00:44 [ 174MiB/s] [
Run Code Online (Sandbox Code Playgroud)

  • @phuclv 没有。标题多次给出不正确的信息。我就是因为这个才来到这里的。我的 1.7GB 文件显示解压后有 4GB,而实际上几乎是 8GB。检查此问题:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775#10 (4认同)
  • 这也像[这个答案](https://superuser.com/a/619659/241386)一样解压缩源文件,所以它不是这个问题的解决方案 (2认同)

Ole*_*nge 9

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

gzcat mycontent.DAT.Gz | LC_ALL=C wc -c
gzip -dc mycontent.DAT.Gz | LC_ALL=C wc -c
Run Code Online (Sandbox Code Playgroud)

  • 这将解压缩源文件。也许这就是 OP 想要的,但这不是问题的答案。 (2认同)

Jam*_*uke 5

不幸的是,唯一知道的方法是提取它并计算字节数。gzip 文件无法正确报告大小 >4GB 的未压缩数据。请参阅RFC1952,它定义了 gzip 文件格式:

ISIZE (Input SIZE)
    This contains the size of the original (uncompressed) input
    data modulo 2^32.
Run Code Online (Sandbox Code Playgroud)

如果您使用的 gzip 版本没有错误,则这种差异可能会更加明显:它将值视为有ISIZE符号 32 位整数(结果为 -1223644243),而不是无符号 32 位整数(这将导致 3071323053)。

仅根据标头您最多可以确定未压缩数据的实际大小是

(n * 4,294,967,296) + 3,071,323,053
Run Code Online (Sandbox Code Playgroud)

其中n是某个整数。