如何知道未压缩的 zip 将占用多少空间

Quo*_*ans 28 zip compression

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

Bic*_*hoy 44

您可以使用unzip -Zt zipname它直接打印关于存档内容的摘要,总大小。这是其输出的示例:

unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed:  76.4%
Run Code Online (Sandbox Code Playgroud)

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

unzip -Zt a.zip | awk '{print $3}'
14956
Run Code Online (Sandbox Code Playgroud)

最后,把它放在一个 for 循环中,如 Tom 的回答:

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


Tom*_*unt 19

如果您键入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
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 15

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
Run Code Online (Sandbox Code Playgroud)

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

如果大多数文件都超过几千字节,请不要担心。但如果文件非常小,您可能需要考虑开销。同样,开销取决于文件系统。在 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}
'
Run Code Online (Sandbox Code Playgroud)