Wie können Sie bei einer (sehr langen) Liste von Zip-Dateien die Größe der entpackten Dateien ermitteln?
Wie können Sie bei einer (sehr langen) Liste von Zip-Dateien die Größe der entpackten Dateien ermitteln?
Antworten:
Sie können dies tun, indem Sie unzip -Zt zipname
eine Zusammenfassung direkt über den Archivinhalt mit der Gesamtgröße ausdrucken. Hier ist ein Beispiel für die Ausgabe:
unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed: 76.4%
Dann können Sie mit awk die Anzahl der Bytes extrahieren:
unzip -Zt a.zip | awk '{print $3}'
14956
Setzen Sie es abschließend wie in Toms Antwort in eine for-Schleife:
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total
Wenn Sie tippen unzip -l <zipfile>
, wird eine Liste der Dateien in der ZIP-Datei mit ihren nicht komprimierten Größen und der gesamten nicht komprimierten Größe aller Dateien gedruckt.
Dies ist eine von Menschen lesbare Ausgabe, aber Sie können eine maschinenlesbare Zahl erhalten, indem Sie verwenden unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'
.
So erhalten Sie eine Gesamtgröße:
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
listet die Größe jeder Datei auf und druckt eine letzte Zeile mit ihrer Summe. So können Sie die zip-Dateien durchlaufen und die Ausgabe vonunzip -l "$zip" | awk 'END {print $1}'
oder von addierenunzip -Zt "$zip" | awk 'END {print $3}'
. Für eine Shell-Schleife unzip -Zt
kann etwas schneller sein:
total=0
for z in *.zip; do
set $(unzip -Zt -- "$z")
total=$((total + $3))
done
Das sagt Ihnen nur die Gesamtgröße der Dateien. Jede Datei hat einen kleinen Overhead: den Speicherplatz zum Speichern ihres Namens, den Speicherplatz zum Speichern einiger ihrer Metadaten und möglicherweise ein wenig ungenutzten Speicherplatz, da die meisten Dateisysteme Dateien in Blöcken zuordnen. Bei typischen Dateisystemen kann der Overhead bis zu einigen Kilobyte betragen. Dies ist nicht genau vorhersehbar, da der Overhead von der Dateigröße, der Verzeichnisstruktur (aufgrund des Verzeichnis-Overheads) und der Fähigkeit des Dateisystems abhängt, mehrere kleine Dateien in einem Block zusammenzuführen.
Wenn die meisten Dateien mehr als ein paar Kilobyte groß sind, machen Sie sich darüber keine Sorgen. Wenn die Dateien jedoch sehr klein sind, sollten Sie den Overhead berücksichtigen. Auch hier hängt der Overhead vom Dateisystem ab. In ext4 füllt jede Datei einen vollständigen Block (4 KB bei den meisten Systemen standardmäßig). Das folgende Skript approximiert die Gesamtgröße, indem jede Datei auf 4 KB gerundet und die Länge des Dateinamens plus einige Bytes addiert wird.
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
) im Vergleich zu XFS, die Inodes dynamisch so viel Speicherplatz zuweisen können, wie sie benötigen.)
Schau ma, keine Schleifen!
Hier ist eine andere Lösung, die möglicherweise etwas schneller ist, da sie keine Schleifen verwendet, aber dennoch zur gleichen Antwort führt.
unzip -l \*.zip|awk 'BEGIN{total=0}/ [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'
Der Teil "BEGIN {total = 0}" ist nicht unbedingt erforderlich.