Frage Wie erhalten Sie die zusammengefassten Größen von Verzeichnissen und deren Unterverzeichnissen?


Nehmen wir an, ich möchte die Größe jedes Verzeichnisses eines Linux-Dateisystems ermitteln. Wenn ich benutze ls -la Ich bekomme die zusammengefasste Größe der Ordner nicht wirklich.

Wenn ich benutze df Ich bekomme die Größe jedes angehängten Dateisystems, aber das hilft mir auch nicht. Und mit du Ich erhalte die Größe jedes Unterverzeichnisses und die Zusammenfassung des gesamten Dateisystems.

Aber ich möchte nur die zusammengefasste Größe jedes Verzeichnisses innerhalb des ROOT-Ordners des Dateisystems haben. Gibt es einen Befehl, das zu erreichen?


259
2017-07-11 17:26


Ursprung


Das --total Flagge war hilfreich für mich. Z.B. du -sh --total applications/*. askubuntu.com/a/465436/48214 - Ryan


Antworten:


Das macht, was du suchst:

du -sh /*

Was das bedeutet:

  • -s Geben Sie nur die Summe für jedes Befehlszeilenargument an.
  • -h für menschenlesbare Suffixe wie M für Megabyte und G für Gigabyte (optional).
  • /* expandiert einfach auf alle Verzeichnisse (und Dateien) in /.

    Hinweis: dotfiles sind nicht enthalten; Lauf shopt -s dotglob um diese auch zu berücksichtigen.

Sinnvoll ist auch die Sortierung nach Größe:

du -sh /* | sort -h

Hier:

  • -h versichert dass sort interpretiert die menschenlesbaren Suffixe korrekt.

367
2017-07-11 17:28



Wenn Sie im Stammverzeichnis über dot-Verzeichnisse verfügen, können Sie verwenden shopt -s dotglob um sie in die Zählung einzubeziehen. - Philipp
Es ist sehr nützlich, weil es einfach ist und Sie anstelle dessen den gewünschten Pfad platzieren können /*, z.B. ./ für aktuelles Verzeichnis oder ./* für jedes Element im aktuellen Verzeichnis. - psur
@psur oder du kannst es benutzen ./*/ um nur Unterordner und nicht alle Elemente zu erhalten - relascope
Sortierte Version: du -sh /* | sort -h - Vu Anh
@ c1phr Wenn dein sort hat nicht -h, du musst es ablassen du Auch sonst wird die Sortierung Kilo / Mega / Gigabyte mischen. du -s /* | sort -nr. - Thomas


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.


70
2017-07-29 12:07



Hier ist ein Weg, um es lesbarer zu bekommen -sh / einige / Pfad | sort -hr | Kopf -n 20 - Xedecimal
@Xedecima das Problem mit der Verwendung von h ist die Art weiß nicht, wie man mit verschiedenen Größen umzugehen. Zum Beispiel ist 268K höher als 255M sortiert, und beide sind höher als 2,7G sortiert - chrisan
Das Argument -h (menschenlesbar) im Befehl 'sort' sollte diese Werte richtig lesen. Genau wie du's -h Fahne exportiert sie. Je nachdem, was Sie gerade laufen, schätze ich. - Xedecimal
Funktioniert in Ubuntu 16.04. Netter Tipp. - SDsolar


Ich mag es zu benutzen Ncdu Dafür können Sie den Cursor verwenden, um durch die Verzeichnisstruktur zu navigieren und zu navigieren.


14
2017-12-24 10:07





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

  1. Sehr einfache Schleife, aber für mich war das ein guter Start für andere Größenoperationen:

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

    du -sh ./*
    

9
2017-11-22 16:53





Folgende du Aufruf sollte auf BSD-Systemen funktionieren:

du -d 1 /

6
2017-07-11 17:29



Meine du (Ubuntu 10.4) hat keine -d Möglichkeit. In welchem ​​System bist du? - Thomas
Auf meinem openSUSE hat es auch keine Option -d :( - 2ndkauboy
OK, dann ist es nur eine BSD-Option (ich bin auf OS X). - Philipp
Richtige portable Option Kombination auf BSD / * NIX ist du -sk /*. Ich hasse das -k Zeug soooo viel. Linux ' -h total rockt. - Dummy00001
in anderen Systemen ist es --max-depth - Vishnu Kumar


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

So erhalten Sie die größten sortierten Objekte (Dateien und Ordner) mit lesbaren Größen unter Linux:

du -h | sort -h

Das wird dich in einer Menge kleiner Akten vergraben. Sie können sie mit loswerden --threshold (1 MB in meinem Beispiel):

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

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

Wenn Sie wirklich nur die Ordner möchten, müssen Sie sie verwenden find aber das kann sehr, sehr langsam seit du muss viele Ordner mehrmals scannen:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

3
2017-07-24 11:04



--threshold ^^^ Diese Option ist unter Linux nicht verfügbar - podarok
@podarok Es ist unter OpenSUSE 13.2 Linux verfügbar. Versuchen Sie, eine neuere Version Ihrer Distribution zu finden oder eine neuere Version des Pakets selbst zu kompilieren. - Aaron Digulla
Es funktioniert nicht mit Ubuntu LTS (14.04). Es ist der jüngste)) - podarok
@podarok Welche Version von GNU Coreutils? Meine ist 8.24. - Aaron Digulla
Caching könnte ein schlechter Begriff gewesen sein. Ich dachte an so etwas wie in diesem Hafen superuser.com/a/597173/121352 Dabei scannen wir den Festplatteninhalt einmal in ein Mapping ein und verwenden dann weiterhin Daten aus diesem Mapping, anstatt den Datenträger erneut zu treffen. - Hennes


Beachten Sie, dass Sie Verzeichnisse nicht mit vergleichen können du auf verschiedenen Systemen / Maschinen, ohne sicher zu sein, teilen sich beide die gleiche Blockgröße des Dateisystems. Dies kann zählen, wenn Sie einige Dateien von einem Linux-Computer zu einem NAS rsync und Sie das synchronisierte Verzeichnis selbst vergleichen möchten. Sie könnten mit anderen Ergebnissen kommen du wegen unterschiedlicher Blockgrößen ....


1
2017-10-05 15:36





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


0
2017-07-12 19:42





Du könntest benutzen ls in Verbindung mit awk:

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

Die Ausgabe von ls ist piped zu awk. awk beginnt mit der Verarbeitung der Daten. Standardtrennzeichen ist Leerzeichen. Die Summenvariable tot wird auf Null initialisiert; Die folgende Anweisung wird für jede Zeile / Zeile ausgeführt, die von ausgegeben wird ls. Es wird nur erhöht tot mit der Größe. $5 steht für fünfte Spalte (ausgegeben von ls). Am Ende teilen wir durch (1024 * 1024) in Megabyte.

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

Wenn Sie systemweite Informationen wünschen, kdirstat könnte nützlich sein!


0
2017-12-20 09:56



Ich stimme zu, man kann dieses Beispiel erweitern und Tricks wie die Größe von "bestimmten Teilmengen 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 verwenden möchte, empfehle ich, Antworten und Kommentare zu lesen diese Frage ebenso wie Artikel dort verlinkt. Ich sage nicht, dass du es überhaupt nicht tun kannst. Kenne die Grenzen, das ist alles. - Kamil Maciorowski