Dato un elenco (davvero lungo) di file zip, come puoi dirne le dimensioni una volta decompresso?
Dato un elenco (davvero lungo) di file zip, come puoi dirne le dimensioni una volta decompresso?
Risposte:
Puoi farlo usando il unzip -Zt zipname
quale stampa un riepilogo direttamente sul contenuto dell'archivio, con dimensioni totali. Ecco un esempio sul suo output:
unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed: 76.4%
Quindi, utilizzando awk, è possibile estrarre il numero di byte:
unzip -Zt a.zip | awk '{print $3}'
14956
Infine, inseriscilo in un ciclo for come nella risposta di Tom:
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total
Se digiti unzip -l <zipfile>
, stampa un elenco di file all'interno della zip, con le loro dimensioni non compresse, quindi la dimensione totale non compressa di tutti.
Questo è un output leggibile dall'uomo, ma è possibile ottenere un numero leggibile da una macchina tramite unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'
.
Per ottenere una dimensione 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
elenca le dimensioni di ciascun file e stampa una riga finale con la loro somma. Quindi puoi scorrere i file zip e aggiungere l'output diunzip -l "$zip" | awk 'END {print $1}'
o di unzip -Zt "$zip" | awk 'END {print $3}'
. Per un loop shell, unzip -Zt
potrebbe essere un po 'più veloce:
total=0
for z in *.zip; do
set $(unzip -Zt -- "$z")
total=$((total + $3))
done
Questo ti dice solo la dimensione totale dei file. Ogni file ha un piccolo overhead: lo spazio per memorizzare il suo nome, lo spazio per memorizzare alcuni dei suoi metadati, e forse un po 'di spazio inutilizzato perché la maggior parte dei filesystem alloca i file in blocchi. Sui filesystem tipici, l'overhead può arrivare a pochi kilobyte. Non è esattamente prevedibile perché l'overhead dipende dalla dimensione del file, dalla struttura della directory (a causa dell'overhead della directory) e dalle capacità del filesystem di unire più piccoli file nello stesso blocco.
Se la maggior parte dei file supera i pochi kilobyte, non preoccuparti. Ma se i file sono molto piccoli, potresti prendere in considerazione l'overhead. Ancora una volta, l'overhead dipende dal filesystem. Su ext4, ogni file riempie un blocco completo (4kB di default sulla maggior parte dei sistemi). Lo script seguente approssima la dimensione totale arrotondando ogni file fino a 4 KB e aggiungendo la lunghezza del nome del file più alcuni byte.
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
), rispetto a XFS che può allocare dinamicamente tanto spazio agli inode di cui ha bisogno.)
Guarda, no loop!
Ecco un'altra soluzione, che potrebbe essere leggermente più veloce, perché non utilizza i loop, ma arriva comunque alla stessa risposta.
unzip -l \*.zip|awk 'BEGIN{total=0}/ [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'
La parte "BEGIN {total = 0}" non è strettamente richiesta.