Come sapere quanto spazio occuperà una zip non compressa


23

Dato un elenco (davvero lungo) di file zip, come puoi dirne le dimensioni una volta decompresso?

Risposte:


38

Puoi farlo usando il unzip -Zt zipnamequale 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

19

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

15

unzip -lelenca 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 -Ztpotrebbe 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}
'

+1 per menzionare i file di piccole dimensioni e il fatto che i filesystem non comprimono i file di piccole dimensioni come fa una zip. AFAIK, nessun filesystem mainstream su win / OSX / Linux / BSD (cioè quelli che potresti raccomandare a qualcuno di usare per / e / home sul loro desktop o server) hanno un piccolo pacchetto di file come opzione. Reiserfs aveva un'opzione per farlo (e code di file più grandi), ma non è mantenuto. Tuttavia, non avevo pensato a nomi di file molto lunghi . Buona pesca.
Peter Cordes,

Puoi anche aggiungere 256B o 512B costanti per file, dato che è la dimensione di un inode (su XFS). Penso che ext4 alloca ancora staticamente gli inode, quindi lo spazio non utilizzato per gli inode non può contenere comunque altri dati. (Questo è il motivo per cui ext4 ha un numero così basso di inode liberi ( df -i), rispetto a XFS che può allocare dinamicamente tanto spazio agli inode di cui ha bisogno.)
Peter Cordes,

1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.