我有一个 32GB 的 .tar.gz 档案,我想知道解压此压缩档案后文件的大小。我想先避免解压档案,然后使用例如du
。
是否也可以无需解压压缩文件即可了解所含文件的大小(在 Linux 和/或 MacOSX 系统上)?
对于另一个档案,我知道它也包含 .tar.gz 文件。是否还可以计算档案中包含的解压档案的大小?(例如,通过设置应模拟“解压”的级别?)
答案1
当然可以。只需使用-tv
列出内容及其大小即可。例如
% tar -tvzf sometools2.tar.gz
-rw-r--r-- madler/admin 3442 2005-02-27 21:40 pngdat.c
-rw-r--r-- madler/admin 24938 2005-02-27 21:39 infgen.c
如果您想要添加尺寸(如du
),您可以使用awk
:
% tar -tvzf sometools2.tar.gz|awk '{ s += $3 } END { print s }'
28380
对于嵌入.tar.gz
文件,当您找到它们时,您需要通过将它们发送到以下地址单独执行这些stdout
操作-O
:
% tar -tvzf imbed.tar.gz
-rw-r--r-- madler/staff 505 2012-02-12 00:06 lucas.c
-rw-r--r-- madler/staff 27913 2005-03-20 11:10 lzwtry.c
-rw-r--r-- madler/staff 8314 2005-02-27 21:42 sometools2.tar.gz
% tar -xOzf imbed.tar.gz sometools2.tar.gz | tar -tvzf - | awk '{ s += $3 } END { print s }'
28380
您可以编写一个脚本来在-tv
输出中找到这些内容,然后提取它们,甚至可以递归执行。我将把这留给读者作为练习。
请注意,这些选项适用于 GNU tar,它在 Linux 和 Mac OS X 上都适用。BSD tar 的选项可能不同。
答案2
首先,你应该知道.tar.gz
后缀表示它是一个压缩tar
文件。tar
只是将多个文件和目录打包成一个文件的一种方式。默认情况下,它没有任何压缩功能。这就是它的用武之地gzip
。它是一个用于压缩单个文件的工具。因此,上述后缀表示它是文件和/或目录的压缩包。
如果你想查看压缩包中每个文件的压缩率,请参阅马克·阿德勒的回答。
如果您只对整个压缩文件(或捆绑包)感兴趣,那么确定解压后大小的正确方法是:
gunzip -l ${file}
示例输出:
$ gunzip -l syslog.1.gz
compressed uncompressed ratio uncompressed_name
4465670 33295551 86.6% syslog.1
压缩和未压缩的数字显示字节数。因此,我的 syslog.1 文件未压缩时大约为 32 MB。
答案3
我不知道如何在终端上执行此类操作(据我所知这是不可能的)。但大多数用于提取档案的编程库也允许查询内容信息(例如树、内容大小),而无需提取整个压缩内容。
因此,您可以使用任何适合您需要的编程语言创建一个命令行工具,然后从命令行调用它。