检查 tar gz 文件的总内容大小

如何从命令行提取. tar.gz 文件中未压缩的文件总数据的大小?

107581 次浏览

这适用于任何文件大小:

zcat archive.tar.gz | wc -c

对于小于4Gb 的文件,你也可以使用 Gzip选项:

$ gzip -l compressed.tar.gz
compressed        uncompressed  ratio uncompressed_name
132               10240  99.1% compressed.tar

Tar 文件被解压缩,直到/除非它通过另一个程序(如 gzip、 bzip2、 lzip、 press、 lzma 等)进行过滤。Tar 文件的文件大小与提取的文件相同,添加的头信息可能少于1kb,从而使其成为有效的 tarball。

这将总结提取文件的总内容大小:

$ tar tzvf archive.tar.gz | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc

输出以字节表示。

说明: tar tzvf以详细的格式(如 ls -l)列出存档中的文件。sedcut隔离文件大小字段。第二个 sed将 a + 放在除第一个之外的所有大小的前面,而 paste将它们连接起来,得到一个求和表达式,然后由 bc求值。

注意,这不包括元数据,因此提取文件时占用的磁盘空间会更大——如果有很多非常小的文件,可能会大很多倍。

命令 gzip -l archive.tar.gz在文件大于2Gb 的情况下无法正常工作。我建议用 zcat archive.tar.gz | wc --bytes代替真正大的文件。

使用以下命令:

tar -xzf archive.tar.gz --to-stdout|wc -c

我知道这是一个古老的答案; 但是两年前我就为此编写了一个工具。它叫做 gzsize,它给你一个未压缩的 gzip 文件大小,而不需要解压整个磁盘文件:

$ gzsize <your file>

我发现在网络上的一切网站,并不解决这个问题的获取大小时,文件大小是4 GB。

首先,哪个最快?

[oracle@base tmp]$ time zcat oracle.20180303.030001.dmp.tar.gz | wc -c
6667028480


real    0m45.761s
user    0m43.203s
sys     0m5.185s
[oracle@base tmp]$ time gzip -dc oracle.20180303.030001.dmp.tar.gz | wc -c
6667028480


real    0m45.335s
user    0m42.781s
sys     0m5.153s
[oracle@base tmp]$ time 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


real    0m46.669s
user    0m44.347s
sys     0m4.981s

当然,Tar-xvf是最快的,但是 如何取消执行后得到头?

我的解决办法是:



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


real    0m1.005s
user    0m0.013s
sys     0m0.066s