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)
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)
您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)
不幸的是,唯一知道的方法是提取它并计算字节数。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
是某个整数。
归档时间: |
|
查看次数: |
62556 次 |
最近记录: |