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


23

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

Answers:


38

您可以使用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

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

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

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

如果大多数文件超过几千字节,请不必为此担心。但是,如果文件很小,则可能需要考虑开销。同样,开销取决于文件系统。在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}
'

+1表示小文件,以及文件系统不会像zip那样将小文件打包在一起的事实。AFAIK,在win / OSX / Linux / BSD上没有主流的文件系统(例如,您可能会建议有人在其台式机或服务器上使用/和/ home的文件系统)具有小的文件打包选项。Reiserfs可以选择执行此操作(以及较大文件的尾部),但此方法无法维护。不过,我没有想到过大的文件。接得好。
彼得·科德斯

您还可以为每个文件添加256B或512B常量,因为这就是inode的大小(在XFS上)。我认为ext4仍然静态分配inode,因此,未用于inode的空间无论如何也无法容纳其他数据。(这就是为什么ext4的自由索引节点(df -i)如此之少的原因,而XFS可以根据需要动态地为索引节点分配尽可能多的空间。)
Peter Cordes

1

看,没有循环!

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

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

并非严格要求“ BEGIN {total = 0}”部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.