Wie kann ich die Größe eines Linux- oder Mac OS X-Verzeichnisses über die Befehlszeile ermitteln?
Mit welchem Befehl kann ich die Größe aller Dateien (rekursiv) in einem Linux- oder Mac OS X-Verzeichnis ermitteln?
Mit welchem Befehl kann ich die Größe aller Dateien (rekursiv) in einem Linux- oder Mac OS X-Verzeichnis ermitteln?
Die in OS X verwendete BSD-Version von du
meldet die Größe mit 512-Byte-Blöcken – die Größen werden im Wesentlichen auf den nächsten 512-Byte-Wert aufgerundet. Das sagt Ihnen den Platz auf der Festplatte, der größer ist als die Datenmenge. Wenn Sie eine Menge kleiner Dateien haben, kann der Unterschied groß sein.
Hier ist ein Beispiel.
Dies ist der Wert mit regulärem du
. Er ist in 512-Byte-Blöcken:
$ du -s
248 .
Das -h
-Flag ergibt eine besser lesbare Zahl in Kilobytes. Wie erwartet, ist es die Hälfte der Anzahl der 512-Byte-Blöcke:
$ du -hs
124K .
Schließlich können Sie find
und awk
verwenden, um die Summe der tatsächlichen Bytes in den Dateien zu erhalten. Das ist zwar etwas langsam, aber es funktioniert:
$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527
Dieser Wert stimmt genau mit der Zahl überein, die vom “Get Info”-Fenster des Finders gemeldet wird. (Es gibt keine seltsamen Forks oder xattrs in diesem Satz von Dateien.) Er ist deutlich kleiner als der Wert, der von du
gemeldet wird.
So funktioniert es: Es holt sich eine Liste aller Dateien und übergibt sie an ls -l
; dann wird awk
benutzt, um die Bytes zu zählen. Das Flag -type f
ist da, damit nur Dateien (und nicht Verzeichnisse) an ls
geschickt werden. Ohne dieses Flag werden auch Verzeichnisnamen an ls
gesendet, und jede Datei wird zweimal aufgelistet: einmal als einzelne Datei und einmal als ein Element im Verzeichnis.
Die GNU-Version von du
kann Werte in tatsächlichen Bytes anstelle von Blöcken angeben. Es ist bedauerlich, dass die BSD-Version von du
nicht so flexibel ist.
Größe einer einzelnen Datei anzeigen
du -h path_to_a_file
Zeigt die Größe des Inhalts eines Verzeichnisses, jedes Unterverzeichnisses und jeder einzelnen Datei:
du -h path_to_a_directory
Zeige die Größe des Inhalts eines Verzeichnisses an:
du -sh path_to_a_directory
du - gibt die Festplattennutzung an, nicht die Dateigröße.
find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'
obiger Terminalcode (im auf osx 10.6) bietet für mich das beste Ergebnis und ist um Längen schneller als “find … -exec”
ein schneller Benchmark
time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970
real 0m0.086s
user 0m0.029s
sys 0m0.073s
time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970
real 0m18.515s
user 0m2.929s
sys 0m9.339s
Sie können du -ah .
verwenden, das die Größen aller Dateien und Verzeichnisse rekursiv anzeigt.
Dies kann mit sort
kombiniert werden, so dass Sie die Top-20 der größten Verzeichnisse im aktuellen Ordner sehen:
du -ah . | sort -rh | head -20
Hinweis: Die Option -h
für sort
ist unter OSX/BSD nicht verfügbar, daher müssen Sie sort
von coreutils
aus installieren (z. B. über brew
) und den bin-Pfad auf PATH
anwenden, z. B.
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.
Ansonsten verwenden:
du -a . | sort -rn | head -20
Ich habe alle Ihre Ansätze kombiniert und mit einer menschenlesbaren Ausgabe kombiniert das Ergebnis ist:
#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'
Link zum Gist: https://gist.github.com/mlegenhausen/9365461