![如何在不实际解压缩 gzip 文件的情况下获取其未压缩的大小?](https://linux22.com/image/1370540/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E5%AE%9E%E9%99%85%E8%A7%A3%E5%8E%8B%E7%BC%A9%20gzip%20%E6%96%87%E4%BB%B6%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%8E%B7%E5%8F%96%E5%85%B6%E6%9C%AA%E5%8E%8B%E7%BC%A9%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
请查看我的操作系统详细信息:
$ 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