Wie viel Platz ein unkomprimierter Reißverschluss einnimmt


23

Wie können Sie bei einer (sehr langen) Liste von Zip-Dateien die Größe der entpackten Dateien ermitteln?

Antworten:


38

Sie können dies tun, indem Sie unzip -Zt zipnameeine 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

19

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

15

unzip -llistet 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 -Ztkann 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}
'

+1 für die Erwähnung kleiner Dateien und die Tatsache, dass Dateisysteme kleine Dateien nicht so zusammenpacken wie ein Zip. AFAIK, keine Mainstream-Dateisysteme unter Win / OSX / Linux / BSD (dh solche, die Sie jemandem empfehlen könnten, der für / und / home auf seinem Desktop oder Server arbeitet), haben kleine Dateipakete als Option. Reiserfs hatte die Möglichkeit, dies zu tun (und die Endstücke größerer Dateien), aber es ist nicht gepflegt. Ich hatte nicht von Massively lange Datei dachte Namen , though. Guter Fang.
Peter Cordes

Sie können auch eine Konstante von 256B oder 512B pro Datei hinzufügen, da dies die Größe eines Inodes (unter XFS) ist. Ich denke, ext4 ordnet immer noch statisch Inodes zu, sodass der nicht für Inodes verwendete Speicherplatz ohnehin keine anderen Daten enthalten kann. (Aus diesem Grund verfügt ext4 über eine so geringe Anzahl freier Inodes ( df -i) im Vergleich zu XFS, die Inodes dynamisch so viel Speicherplatz zuweisen können, wie sie benötigen.)
Peter Cordes,

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.