it-swarm.com.de

Wie erhalte ich die Größe eines Linux- oder Mac OS X-Verzeichnisses über die Befehlszeile?

Welchen Befehl verwende ich, um die Größe aller Dateien (rekursiv) in einem Linux- oder Mac OS X-Verzeichnis zu ermitteln?

70
Daryl Spitzer

Die in OS X verwendete BSD-Version von du gibt die Größe mit 512-Byte-Blöcken an - die Größen werden im Wesentlichen auf den nächsten 512-Byte-Wert aufgerundet. Hier sehen Sie den Speicherplatz auf der Festplatte, der größer ist als die Datenmenge. Wenn Sie viele kleine Dateien haben, kann der Unterschied groß sein.

Hier ist ein Beispiel.

Dies ist der Wert mit der regulären du. Es ist in 512-Byte-Blöcken:

$ du -s
248   .

Das Flag -h führt zu einer besser lesbaren Zahl in Kilobyte. Wie erwartet ist es die Hälfte der Anzahl von 512-Byte-Blöcken:

$ du -hs
124K  .

Schließlich können Sie find und awk verwenden, um die Summe der tatsächlichen Bytes in den Dateien anzugeben. Das ist ein bisschen 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 im Finder-Fenster "Informationen" angezeigt wird. (Es gibt keine seltsamen Gabeln oder Xattrs in dieser Gruppe von Dateien.) Sie ist erheblich kleiner als der von du angegebene Wert.

So funktioniert es: Es wird eine Liste aller Dateien abgerufen und an ls -l übergeben. dann wird awk verwendet, um die Bytes zu zählen. Das Flag -type f ist vorhanden, damit nur Dateien (und keine Verzeichnisse) an ls gesendet werden. Ohne dieses Flag werden auch Verzeichnisnamen an ls gesendet, und jede Datei wird zweimal aufgelistet: einmal als einzelne Datei und einmal als Element im Verzeichnis.

Die GNU -Version von du kann Werte in tatsächlichen Bytes anstelle von Blöcken angeben. Leider ist die BSD-Version von du nicht so flexibel.

79
wch

Zeigt die Größe einer einzelnen Datei an

du -h path_to_a_file

Zeigen Sie die Größe des Inhalts eines Verzeichnisses, jedes Unterverzeichnisses und jeder einzelnen Datei an:

du -h path_to_a_directory

Zeigen Sie die Größe des Inhalts eines Verzeichnisses an:

du -sh path_to_a_directory

75
Daryl Spitzer

du - teilt der Datenträgernutzung nicht die Dateigröße mit.

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

der obige terminal code (im on osx 10.6) bietet für mich das beste ergebnis und ist waaay 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
9
Acid

Sie können du -ah . verwenden, um die Größe aller Dateien und Verzeichnisse rekursiv anzuzeigen.

Dies kann mit sort kombiniert werden, sodass die 20 größten Verzeichnisse im aktuellen Ordner angezeigt werden:

du -ah . | sort -rh | head -20

Hinweis: Die Option -h für sort ist unter OSX/BSD nicht verfügbar. Sie müssen also sort von coreutils installieren (z. B. über brew) und den bin-Pfad auf PATH anwenden, z.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Ansonsten verwenden Sie:

du -a . | sort -rn | head -20
5
kenorb

Ich habe alle Ihre Ansätze kombiniert und mit einer vom Menschen lesbaren 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

2
malte