Comment savoir combien d'espace un zip non compressé prendra

Compte tenu d'une list (vraiment longue) de files zip, comment pouvez-vous dire la taille de ceux-ci une fois décompressé?

Vous pouvez le faire en utilisant unzip -Zt zipname qui imprime un résumé directement sur le contenu de l'archive, avec la taille totale. Voici un exemple sur sa sortie:

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

Ensuite, en utilisant awk, vous pouvez extraire le nombre d'octets:

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

Enfin, mettez-le dans une boucle for comme dans la réponse de Tom:

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

Si vous tapez unzip -l <zipfile> , il unzip -l <zipfile> une list de files dans le zip, avec leurs tailles non compressées, puis la taille totale non compressée de tous.

Ceci est une sortie lisible par l'homme, mais vous pouvez get un numéro lisible par une machine en utilisant unzip -l <zipfile> | tail -n1 | awk '{ print $1 }' unzip -l <zipfile> | tail -n1 | awk '{ print $1 }' unzip -l <zipfile> | tail -n1 | awk '{ print $1 }' .

Pour get une taille totale:

 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 list la taille de chaque file et imprime une dernière ligne avec leur sum. Vous pouvez donc parcourir les files zip et append la sortie de l' unzip -l "$zip" | awk 'END {print $1}' unzip -l "$zip" | awk 'END {print $1}' ou d' unzip -Zt "$zip" | awk 'END {print $3}' unzip -Zt "$zip" | awk 'END {print $3}' . Pour une boucle shell, unzip -Zt peut être un peu plus rapide:

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

Cela vous indique seulement la taille totale des files. Chaque file a un petit overhead: l'espace pour stocker son nom, l'espace pour stocker certaines de ses métadonnées, et éventuellement un peu d'espace inutilisé car la plupart des filesystems allouent des files en blocs. Sur les filesystems typiques, la surcharge peut atteindre quelques kilo-octets. Ce n'est pas exactement prévisible car le time système dépend de la taille du file, de la structure du directory (en raison de la surcharge du directory) et des capacités du système de files à merge plusieurs petits files dans le même bloc.

Si la plupart des files sont plus de quelques kilo-octets, ne vous inquiétez pas à ce sujet. Mais si les files sont très petits, vous voudrez peut-être prendre en count les frais généraux. Encore une fois, le time système dépend du système de files. Sur ext4, chaque file remplit un bloc complet (4 Ko par défaut sur la plupart des systèmes). Le script suivant se rapproche de la taille totale en arrondissant chaque file jusqu'à 4 Ko et en ajoutant la longueur du nom du file plus quelques octets.

 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} ' 

Regardez ma, pas de loops!

Voici une autre solution, qui peut être légèrement plus rapide, car elle n'utilise pas de loops, mais arrive toujours à la même réponse.

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

La partie "BEGIN {total = 0}" n'est pas ssortingctement requirejse.