Wie erhält man die zusammengefassten Größen von Verzeichnissen und deren Unterverzeichnissen?

307

Angenommen, ich möchte die Größe jedes Verzeichnisses eines Linux-Dateisystems ermitteln. Wenn ich benutze, ls -laerhalte ich nicht wirklich die zusammengefasste Größe der Ordner.

Wenn ich benutze, dfbekomme ich die Größe jedes gemounteten Dateisystems, aber das hilft mir auch nicht. Und mit dubekomme ich die Größe jedes Unterverzeichnisses und die Zusammenfassung des gesamten Dateisystems.

Ich möchte aber nur die zusammengefasste Größe jedes Verzeichnisses im ROOT-Ordner des Dateisystems haben. Gibt es einen Befehl, um das zu erreichen?

2ndkauboy
quelle
Die --totalFlagge war hilfreich für mich. Eg du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Antworten:

433

Das macht was Sie suchen:

du -sh /*

Was das bedeutet:

  • -s Geben Sie nur die Summe für jedes Befehlszeilenargument an.
  • -hfür lesbare Suffixe wie Mfür Megabyte und Gfür Gigabyte (optional).
  • /*Erweitert einfach auf alle Verzeichnisse (und Dateien) in /.

    Hinweis: Punktedateien sind nicht enthalten. laufen shopt -s dotglob, um diese auch einzuschließen.

Auch nützlich ist das Sortieren nach Größe:

du -sh /* | sort -h

Hier:

  • -hstellt sicher, dass sortdie lesbaren Suffixe korrekt interpretiert werden.
Thomas
quelle
8
Wenn Sie im Stammverzeichnis Punktverzeichnisse haben, können Sie diese verwenden shopt -s dotglob, um sie in die Zählung aufzunehmen.
Philipp
8
Es ist sehr nützlich, da es einfach ist und Sie den gewünschten Pfad angeben können /*, z. B. ./für das aktuelle Verzeichnis oder ./*für jedes Element im aktuellen Verzeichnis.
psur
3
@psur oder Sie können verwenden ./*/, um nur Unterordner und nicht alle Elemente zu erhalten
Relascope
7
Sortierte Version:du -sh /* | sort -h
Vu Anh
2
@ c1phr Wenn sortdies nicht der Fall ist -h, müssen Sie es ebenfalls auslassen du, da sonst die Sortierung Kilo / Mega / Gigabyte vertauscht. du -s /* | sort -nr.
Thomas
79

Ich muss oft die größten Verzeichnisse finden, um eine sortierte Liste mit den 20 größten Verzeichnissen zu erhalten:

du -m /some/path | sort -nr | head -n 20

In diesem Fall werden die Größen in Megabyte angegeben.

Janne Pikkarainen
quelle
11
Hier ist ein Weg, um es lesbarer zu machen du -sh / some / path | sort -hr | head -n 20
Xedecimal
6
@Xedecima Das Problem bei der Verwendung von h ist, dass die Sorte nicht weiß, wie sie mit unterschiedlichen Größen umgeht. Zum Beispiel ist 268K höher als 255M sortiert und beide sind höher als 2,7G sortiert
chrisan
4
Das Argument -h (vom Menschen lesbar) im Befehl 'sort' sollte diese Werte korrekt lesen. Genau wie du's -h exportiert flag sie. Ich schätze, je nachdem, was du rennst.
Xedecimal
Funktioniert in Ubuntu 16.04. Netter Tipp.
SDsolar
sudo du -haxt 1G / | sort -hr | head -30
deviant
22

Ich verwende dafür gerne Ncdu . Sie können den Cursor verwenden, um durch die Verzeichnisstruktur zu navigieren und einen Drilldown durchzuführen. Es funktioniert wirklich gut.

BuddhaLincoln
quelle
Genial. Stichwörter: du meets ncurses. Sie können verwenden b, um in eine Shell im Verzeichnis abzulegen.
Ciro Santilli am
11

Die vorhandenen Antworten sind sehr hilfreich, vielleicht finden auch Anfänger (wie ich) dies hilfreich.

  1. Sehr einfache Schleife, aber für mich war dies ein guter Anfang für einige andere Operationen im Zusammenhang mit der Größe:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Sehr ähnlich wie die erste Antwort und fast dasselbe Ergebnis wie 1.), aber ich habe einige Zeit gebraucht, um den Unterschied von * zu ./* zu verstehen, wenn in einem Unterverzeichnis:

    du -sh ./*
    
Martin
quelle
for eachfunktioniert nicht, da Konsolenzeichen (z. B. \033[) an die
Ordnerliste angehängt werden
@machineaddict nicht sicher, was du meinst. Ich benutze dies die ganze Zeit, funktioniert für mich ganz gut.
Martin
Versuchen Sie, Ihren Befehl beginnend mit auszuführen for each. es wird nicht funktionieren
machineaddict
Ich führe den Befehl genau so aus, wie er hier geschrieben ist. beginnend mit für jeden. funktioniert.
Martin
7

Der folgende duAufruf sollte auf BSD-Systemen funktionieren:

du -d 1 /
Philipp
quelle
1
Mein du(Ubuntu 10.4) hat keine -dOption. Auf welchem ​​System bist du?
Thomas
Auf meinem openSUSE gibt es auch keine Option -d :(
2ndkauboy
OK, dann ist es nur eine BSD-Option (ich bin auf OS X).
Philipp
Richtige portable Optionskombination unter BSD / * NIX ist du -sk /*. Ich hasse das -kZeug soooo sehr. Linux -hrockt total.
Dummy00001
in anderen Systemen ist es--max-depth
Vishnu Kumar
4

Das ist nicht einfach. Der duBefehl zeigt entweder Dateien und Ordner (Standard) oder nur die Größe aller Elemente an, die Sie in der Befehlszeile angeben (Option -s).

So erhalten Sie die größten Elemente (Dateien und Ordner) sortiert und in lesbaren Größen unter Linux:

du -h | sort -h

Dies wird Sie in einer Tonne von kleinen Dateien begraben. Sie können sie mit --threshold(1 MB in meinem Beispiel) loswerden :

du --threshold=1M -h | sort -h

Der Vorteil dieses Befehls ist, dass er versteckte Punktordner enthält (Ordner, die mit beginnen .).

Wenn Sie die Ordner wirklich nur benötigen, müssen Sie sie verwenden. findDies kann jedoch sehr, sehr langsam sein, da duviele Ordner mehrmals gescannt werden müssen:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h
Aaron Digulla
quelle
1
--threshold ^^^ Diese Option ist unter Linux nicht verfügbar
podarok 06.10.15
1
@podarok Es ist unter OpenSUSE 13.2 Linux verfügbar. Versuchen Sie, eine neuere Version Ihrer Distribution zu finden, oder kompilieren Sie selbst eine neuere Version des Pakets.
Aaron Digulla
Es funktioniert nicht mit Ubuntu LTS (14.04). Es ist die neueste))
Podarok
@podarok Welche Version von GNU coreutils? Meins ist 8.24.
Aaron Digulla
1
Caching könnte ein schlechter Begriff gewesen sein. Ich dachte an etwas, das in diesem Port superuser.com/a/597173/121352 gemacht wurde, in dem wir den Festplatteninhalt einmal in eine Zuordnung scannen und dann die Daten aus dieser Zuordnung weiter verwenden, anstatt die Festplatte erneut zu treffen.
Hennes
1

duBeachten Sie, dass Sie Verzeichnisse nicht mit auf verschiedenen Systemen / Maschinen vergleichen können, ohne sicherzugehen, dass beide die gleiche Blockgröße des Dateisystems haben. Dies kann zählen, wenn Sie einige Dateien von einem Linux-Computer auf einen NAS synchronisieren und das synchronisierte Verzeichnis selbst vergleichen möchten. Sie erhalten möglicherweise unterschiedliche Ergebnisse duaufgrund unterschiedlicher Blockgrößen.

Jimmy Koerting
quelle
0

Vielleicht möchten Sie auch xdiskusage ausprobieren . Gibt Ihnen die gleichen Informationen, wird jedoch grafisch angezeigt und ermöglicht einen Drilldown (sehr nützlich). Es gibt andere ähnliche Dienstprogramme für KDE und sogar für Windows.

sleske
quelle
0

Sie könnten lsin Verbindung mit verwenden awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

Der Ausgang von lswird zu geleitet awk. awkStartet die Verarbeitung der Daten. Das Standardtrennzeichen ist Leerzeichen. Die Summenvariable totwird auf Null initialisiert; Die folgende Anweisung wird für jede Zeile / Zeile ausgeführt, die von ausgegeben wird ls. Es erhöht sich lediglich totmit der Größe. $5steht für fünfte Spalte (ausgegeben von ls). Am Ende dividieren wir durch (1024 * 1024), um in Megabyte zu summieren.

Wenn Sie dies in ein Skript oder eine Funktion (.bashrc) konvertieren möchten, können Sie damit auch die Größe bestimmter Untergruppen von Verzeichnissen nach Dateitypen ermitteln.

Wenn Sie systemweite Informationen wünschen, kdirstatkönnen Sie sich als nützlich erweisen!

JM Stoorvogel
quelle
Ich bin damit einverstanden, dass man dieses Beispiel erweitern und Tricks ausführen kann, wie die Größe von "bestimmten Untergruppen von Verzeichnissen nach Dateitypen" usw .; Es scheint ein guter Ausgangspunkt zu sein. Trotzdem ist diese Lösung von Anfang an fehlerhaft. Jedem Benutzer, der diese Methode anwenden möchte, empfehle ich, die Antworten und Kommentare zu dieser Frage sowie den dort verlinkten Artikel zu lesen . Ich sage nicht, dass du es überhaupt nicht kannst. Kennen Sie die Grenzen, das ist alles.
Kamil Maciorowski