如何知道未压缩的 zip 需要多少空间

如何知道未压缩的 zip 需要多少空间

给定一个(非常长的)zip 文件列表,您如何知道它们解压后的大小?

答案1

您可以使用unzip -Zt zipname它直接打印有关存档内容的摘要以及总大小来执行此操作。这是其输出的示例:

unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed:  76.4%

然后,使用 awk,您可以提取字节数:

unzip -Zt a.zip | awk '{print $3}'
14956

最后,将其放入 for 循环中,如汤姆的回答所示:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total

答案2

如果您输入unzip -l <zipfile>,它会打印 zip 中的文件列表,包括它们的未压缩大小,然后是所有文件的未压缩总大小。

这是人类可读的输出,但您可以使用 获得机器可读的数字unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'

要获得总大小:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -l $file | tail -n1 | awk '{ print $1 }') ))
done
echo $total

答案3

unzip -l列出每个文件的大小并打印最后一行及其总和。所以你可以循环遍历 zip 文件并将输出加起来unzip -l "$zip" | awk 'END {print $1}'或的unzip -Zt "$zip" | awk 'END {print $3}'。对于 shell 循环,unzip -Zt可能会快一点:

total=0
for z in *.zip; do
  set $(unzip -Zt -- "$z")
  total=$((total + $3))
done

这仅告诉您文件的总大小。每个文件都有很小的开销:存储其名称的空间、存储其某些元数据的空间,以及可能有一些未使用的空间,因为大多数文件系统以块的形式分配文件。在典型的文件系统上,开销可能高达几千字节。它并不完全可预测,因为开销取决于文件大小、目录结构(由于目录开销)以及文件系统将多个小文件合并到同一块中的能力。

如果大多数文件都超过几千字节,请不要担心这一点。但如果文件非常小,您可能需要考虑开销。再次强调,开销取决于文件系统。在 ext4 上,每个文件填充一个完整的块(大多数系统默认为 4kB)。以下脚本通过将每个文件四舍五入到 4kB 并添加文件名的长度加上几个字节来估算总大小。

for z in *.zip; do
  unzip -l -- "$z"
done | awk '
    $2 ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ {total += ($1+4095)/4096*4096 + length($0)}
    END {print total}
'

答案4

看,妈妈,没有循环!

这是另一个解决方案,可能会稍微快一些,因为它不使用循环,但仍然得到相同的答案。

unzip -l \*.zip|awk 'BEGIN{total=0}/        [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'

“BEGIN{total=0}”部分不是严格必需的。

相关内容