给定一个(非常长的)zip文件列表,一旦解压缩后如何判断它们的大小?
给定一个(非常长的)zip文件列表,一旦解压缩后如何判断它们的大小?
Answers:
您可以使用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循环中,如Tom的回答:
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total
如果键入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
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}
'
df -i
)如此之少的原因,而XFS可以根据需要动态地为索引节点分配尽可能多的空间。)