如何从命令行中提取.tar.gz文件中总未压缩的文件数据大小?
这适用于任何文件大小:
zcat archive.tar.gz | wc -c
对于小于4GB的文件,您还可以使用-l选项与gzip一起使用:
$ gzip -l compressed.tar.gz
compressed uncompressed ratio uncompressed_name
132 10240 99.1% compressed.tar
tar -tf...
命令将在完整文件上运行 gzip -d
,因此您实际上会提取tar文件。此处所述的 gzip -l
不会提取文件,因此速度非常快。 - Vadim Fintzcat archive.tar.gz | wc -c
。 - nedned这将计算所提取文件的总内容大小:
$ tar tzvf archive.tar.gz | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc
输出的单位是字节(bytes)。
解释: tar tzvf
以详细格式列出存档文件中的文件,类似于 ls -l
。使用 sed
和 cut
分离出文件大小字段。第二个 sed
在每个大小前面放置一个 +,除了第一个之外,然后使用 paste
连接它们,得到一个求和表达式,由 bc
进行计算。
请注意,这不包括元数据,因此当您提取文件时占用的磁盘空间将会更大-如果您有许多非常小的文件,则可能会比实际大小大很多倍。
tar tzvf archive.tar.gz | awk '{s+=$3} END{print (s/1024/1024), MB}'
的意思是:列出 archive.tar.gz
压缩文件中所有文件的详细信息,并使用 awk 工具计算文件大小总和,最后以兆字节 (MB) 为单位输出。 - Rubenstar: Unexpected EOF in archive
的错误。 - Smeterlinkgzip -l archive.tar.gz
命令在文件大小大于2GB时无法正常工作。我建议对于非常大的文件,使用zcat archive.tar.gz | wc --bytes
代替。
gzip -l
在文件大小大于 4GB 时无法工作,因为 gzip 只使用 4 个字节来存储原始文件大小。 - kevin我知道这是一个旧的答案,但是两年前我写了一个工具专门为此而设计。它叫做gzsize
,它可以在不实际解压整个文件的情况下给出gzip文件的未压缩大小:
$ gzsize <your file>
zcat|wc -l
花费了60秒和42秒,而 gzsize
则只花费了29秒和15秒。 - bfontainetar -xzf archive.tar.gz --to-stdout|wc -c
我在网上找到了很多站点,但是无法解决文件大小大于4GB时获取文件大小的问题。
首先,哪个更快?
[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
tar文件只有在通过其他程序(如gzip、bzip2、lzip、compress、lzma等)过滤后才会被解压缩。tar文件的文件大小与提取的文件相同,可能只添加了不到1kb的头信息以使其成为有效的tarball。