给定一个(非常长的)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}”部分不是严格必需的。