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

74

Diese Frage hat hier bereits eine Antwort:

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

Daryl Spitzer
quelle
2
Sie können die -kOption verwenden, um eine Blockgröße von 1 KB zu verwenden
Zoker
Ich will nur diese kostenlose Software Disk - Inventar genannt X. empfehlen es hier herunterladen derlien.com es einfach ist für Mac OS X zu verwenden
Nimitack
Anstatt du, wie ich es benutze ncdu, können Sie den Verweis hier finden, remysharp.com/2018/08/23/cli-improved
Alan Dong

Antworten:

82

Die duin OS X verwendete BSD-Version 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 bei regular du. Es ist in 512-Byte-Blöcken:

$ du -s
248   .

Das -hFlag 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 findund verwenden awk, um die Summe der tatsächlichen Bytes in den Dateien anzuzeigen. 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 diesem Satz von Dateien.) Er ist erheblich kleiner als der von gemeldete Wert du.

So funktioniert es: Es wird eine Liste aller Dateien abgerufen und an übergeben ls -l. Dann awkwerden die Bytes hochgezählt. Das -type fFlag ist dort, damit nur Dateien (und keine Verzeichnisse) gesendet werden ls. Ohne dieses Flag werden auch Verzeichnisnamen an gesendet ls, und jede Datei wird zweimal aufgelistet: einmal als einzelne Datei und einmal als Element im Verzeichnis.

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

wch
quelle
Tolle Erklärung. Interessanterweise erhalte ich bei Verwendung duvon GNU coreutils mit der -bOption ein anderes Ergebnis als mit Ihrer findPipe. Für ein 36 GB Verzeichnis erhalte ich einen Unterschied von 82 KB.
Stefan Schmidt
Gibt es eine Möglichkeit, dies in einem besser lesbaren Format auszudrucken?
anon58192932
75

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

Daryl Spitzer
quelle
25
du -schwenn Sie etwas leichter lesbar wollen.
Joey
@Johannes, ich denke du solltest diesen Kommentar als Antwort posten, damit er akzeptiert werden kann?
Arjan
Ich finde die Option -c redundant (zumindest unter Mac OS X) und du -sh unterdrückt die Zwischensummen.
Daryl Spitzer
Aha, ich wusste nicht, dass man seine eigene Antwort akzeptieren kann. Jetzt wissen zumindest die Leute, dass die Frage gelöst ist.
Arjan
Ich nehme gerne eine neue Antwort an, die eine Verbesserung gegenüber meiner darstellt.
Daryl Spitzer
9

du - teilt der Festplatte mit, dass sie nicht die Dateigröße verwendet .

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
Acid
quelle
Wenn Sie das gleiche auf Ubuntu tun möchten:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo
Gibt es eine Möglichkeit, dieses Ergebnis in einem für Menschen lesbaren Format zu erhalten?
anon58192932
6

Sie können verwenden, du -ah .welche Größen aller Dateien und Verzeichnisse rekursiv angezeigt werden.

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

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

Hinweis: Die Option -hfür sortist unter OSX / BSD nicht verfügbar. Sie müssen also sortvon coreutils(z. B. über brew) installieren und den bin-Pfad auf PATHz. B. anwenden

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

Ansonsten verwenden Sie:

du -a . | sort -rn | head -20
Kenorb
quelle
Erster Befehl funktioniert nicht auf meinem MacOS 10.12.1 #du -ah. | sort -rh | head -20 sort: ungültige Option - h Weitere Informationen erhalten Sie unter `sort --help '.
Nucleartux
3
@nucleartux Überprüfen Sie den Hinweis unter dem Befehl. Dies funktioniert in GNU sort, das Sie unter macOS installieren können brew install coreutils, andernfalls verwenden Sie den BSD-Befehl sort am Ende without -h.
Kenorb
2

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 Inhalt: https://gist.github.com/mlegenhausen/9365461

malte
quelle