如何从命令行提取. tar.gz 文件中未压缩的文件总数据的大小?
这适用于任何文件大小:
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)列出存档中的文件。sed和 cut隔离文件大小字段。第二个 sed将 a + 放在除第一个之外的所有大小的前面,而 paste将它们连接起来,得到一个求和表达式,然后由 bc求值。
tar tzvf
ls -l
sed
cut
paste
bc
注意,这不包括元数据,因此提取文件时占用的磁盘空间会更大——如果有很多非常小的文件,可能会大很多倍。
命令 gzip -l archive.tar.gz在文件大于2Gb 的情况下无法正常工作。我建议用 zcat archive.tar.gz | wc --bytes代替真正大的文件。
gzip -l archive.tar.gz
zcat archive.tar.gz | wc --bytes
使用以下命令:
tar -xzf archive.tar.gz --to-stdout|wc -c
我知道这是一个古老的答案; 但是两年前我就为此编写了一个工具。它叫做 gzsize,它给你一个未压缩的 gzip 文件大小,而不需要解压整个磁盘文件:
gzsize
$ 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