2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76

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?

Antworten (5)

83
83
83
2012-03-18 05:54:47 +0000

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.

75
75
75
2009-08-13 20:01:52 +0000

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

9
9
9
2013-11-11 22:31:48 +0000

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
6
6
6
2015-03-05 14:03:07 +0000

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
2
2
2
2014-03-05 11:30:06 +0000

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

Verwandte Fragen

6
10
12
7
5