Wie liste ich die Größe jeder Datei und jedes Verzeichnisses auf und sortiere nach absteigender Größe in Bash?

107

Ich habe festgestellt, dass es nicht einfach ist, die Größe eines Verzeichnisses in Bash zu ermitteln.

Ich möchte, dass beim Tippen die ls -<some options>gesamte Summe der Dateigröße des Verzeichnisses rekursiv und der Dateien gleichzeitig aufgelistet und nach Größenreihenfolge sortiert werden kann.

Ist das möglich?

Kit Ho
quelle
2
Was genau meinst du mit der "Größe" eines Verzeichnisses? Die Anzahl der Dateien darunter (rekursiv oder nicht)? Die Summe der Größen der Dateien darunter (rekursiv oder nicht)? Die Festplattengröße des Verzeichnisses selbst? (Ein Verzeichnis ist als spezielle Datei implementiert, die Dateinamen und andere Informationen enthält.)
Keith Thompson
sollte die Summe der Größen der Dateien darunter rekursiv sein
Kit Ho
1
@ Kit: Dann duist die Antwort.
Keith Thompson
Der duBefehl @KeithThompson @KitHo schätzt die Speicherplatznutzung, sodass Sie ihn nicht verwenden können, wenn Sie die genaue Größe erhalten möchten.
ztank1013
@ ztank1013: Abhängig davon, was Sie unter "der genauen Größe" verstehen du(zumindest die GNU-Coreutils-Version), besteht wahrscheinlich die Möglichkeit, die Informationen bereitzustellen.
Keith Thompson

Antworten:

218

Navigieren Sie einfach zum Verzeichnis und führen Sie den folgenden Befehl aus:

du -a --max-depth=1 | sort -n

ODER fügen Sie -h für lesbare Größen und -r hinzu, um zuerst größere Verzeichnisse / Dateien zu drucken.

du -a -h --max-depth=1 | sort -hr
Entwickler
quelle
23
du -herfordert sort -hauch, um sicherzustellen, dass etwa 981MSorten vorher sagen 1.3G; mit sort -nnur den Zahlen würden berücksichtigt und sie wären falsch herum.
Smylers
Hier werden nicht die Größe der einzelnen Dateien im aktuellen Verzeichnis, sondern nur die Größe der Unterverzeichnisse und die Gesamtgröße des aktuellen Verzeichnisses aufgeführt. Wie würden Sie auch einzelne Dateien in die Ausgabe aufnehmen (um die Frage von OP zu beantworten)?
Erik Trautman
@ErikTrautman, um die Dateien aufzulisten, die Sie auch hinzufügen -aund verwenden müssen, --allanstatt --max-depth=1wie folgtdu -a -h --all | sort -h
Franco
Genial! Ich mache jetzt seit ein paar Jahren etwas Lameres. :)
Colby Blair
6
sort -hfunktioniert nur unter GNUs Version / Linux, kein Glück mit BSD / OS X.
djule5
20

Anscheinend ist die --max-depthOption nicht in der Mac OS X-Version des duBefehls enthalten. Sie können stattdessen Folgendes verwenden.

du -h -d 1 | sort -n

Cevaris
quelle
Anscheinend, aber nicht überraschend.
Josh Habdas
20
du -s -- * | sort -n

(Dies zeigt keine versteckten (.dotfiles) Dateien an.)

Verwenden Sie du -smfür Mb-Einheiten usw. Ich benutze immer

du -smc -- * | sort -n

weil die gesamte Zeile ( -c) aus offensichtlichen Gründen ganz unten landet :)

PS:

  • Siehe Kommentare zum Umgang mit Punktedateien
  • Ich benutze häufig zB 'du -smc / home / / | sort -n | tail ', um ein Gefühl dafür zu bekommen, wo genau die großen Teile sitzen
sehe sehen
quelle
5
du --max-depth=1|sort -noder auch find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nzum Einfügen von Punktedateien.
Arnaud Le Blanc
@arnoud: Ich benutze das auch, aber es schien nicht die richtige Ergänzung für diese Frage (/ Antwort) :)
sehe
@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nwenn einige der gefundenen Pfade Leerzeichen enthalten könnten.
Lri
1
Dies ist eine großartige Variante, um eine lesbare Ansicht des größten zu erhalten:sudo du -smch * | sort -h | tail
Marsbard
16

Befehl

du -h --max-depth=0 * | sort -hr

Ausgabe

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Erläuterung

  • du zeigt "Festplattennutzung" an
  • h ist für "menschlich lesbar" (sowohl in der Art als auch in du)
  • max-depth=0 meint du zeigt nicht die Größe von Unterordnern an (entfernen Sie diese, wenn Sie alle Größen jeder Datei in jedem Unter-, Unter-, ..., Ordner anzeigen möchten).
  • r ist für "umgekehrt" (größte Datei zuerst)

ncdu

Als ich zu dieser Frage kam, wollte ich mein Dateisystem bereinigen. Das Kommandozeilen-Toolncdu ist für diese Aufgabe viel besser geeignet.

Installation unter Ubuntu:

$ sudo apt-get install ncdu

Verwendung:

Geben Sie einfach ncdu [path]die Befehlszeile ein. Nach einigen Sekunden für die Analyse des Pfads sehen Sie ungefähr Folgendes:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Löschen Sie das aktuell markierte Element mit dund beenden Sie mit CTRL+c

Martin Thoma
quelle
Sie können auch du -hs * | schreiben sort -hr. -s (zusammenfassen) ist das gleiche wie --max-depth = 0
rasmusx
5

ls -Ssortiert nach Größe. Um auch die Größe anzuzeigen , ls -lSwird eine lange ( -l), sortiert nach size ( -S) -Anzeige angezeigt. Normalerweise füge ich auch hinzu -h, um das Lesen zu erleichtern ls -lhS.

Thanatos
quelle
1
Ah, sorry, das war aus deinem Beitrag nicht klar. Sie wollen du, anscheinend hat es jemand gepostet. @sehe: Hängt von Ihrer Definition von real ab - es zeigt den Speicherplatz an, den das Verzeichnis zum Speichern verwendet. (Es wird nur nicht auch die Größe der Untereinträge hinzugefügt.) Es ist keine Zufallszahl und es sind nicht immer 4 KB.
Thanatos
1

Einfach und schnell:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* erfordert GNU Parallel .

pje
quelle
0

Ich glaube, ich hätte herausgefunden, was Sie tun möchten. Dadurch erhalten Sie eine sortierte Liste aller Dateien und Verzeichnisse, sortiert nach Dateigröße und Größe des Inhalts in den Verzeichnissen.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
dvorak
quelle
Trotzdem hat sehe eine viel einfachere Lösung vorgestellt. Ich lerne jeden Tag etwas Neues!
Dvorak
Ich denke nicht, dass die Verwendung dueine Option ist. Sie erhalten nur ein ungefähres Ergebnis.
ztank1013
0

[erweiterte Version]
Dies wird viel schneller und präziser sein als die unten stehende ursprüngliche Version und gibt die Summe aller Dateigrößen des aktuellen Verzeichnisses aus:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

Der stat -c %sBefehl für eine Datei gibt ihre Größe in Byte zurück. Der trBefehl hier wird verwendet, um xargsBefehlsbeschränkungen zu überwinden (anscheinend werden die xargsErgebnisse in mehrere Zeilen aufgeteilt, wodurch die Logik meines Befehls verletzt wird). Daher trwird darauf geachtet, den Zeilenvorschub durch ein +Pluszeichen zu ersetzen . sedhat das einzige Ziel, das letzte +Vorzeichen aus der resultierenden Zeichenfolge zu entfernen , um Beschwerden beim letzten bcBefehl (Basisrechner) zu vermeiden , der wie üblich die Mathematik ausführt.

Leistung: Ich habe es in mehreren Verzeichnissen getestet und über 150.000 Dateien oben (die aktuelle Anzahl der Dateien meiner Fedora 15-Box), was meiner Meinung nach ein erstaunliches Ergebnis ist:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Nur für den Fall, dass Sie einen Vergleich mit dem du -sb /Befehl durchführen möchten , wird eine geschätzte Festplattennutzung in Bytes ausgegeben ( -bOption).

# du -sb /
12684646920 /

Wie ich erwartet hatte, ist es etwas größer als meine Befehlsberechnung, weil die du Dienstprogramm den zugewiesenen Speicherplatz jeder Datei und nicht den tatsächlich verbrauchten Speicherplatz zurückgibt.

[Erstversion]
Sie können den duBefehl nicht verwenden, wenn Sie die genaue Summengröße Ihres Ordners kennen müssen, weil (gemäß Manpage-Zitat)du die Speicherplatznutzung geschätzt wird. Daher führt dies zu einem falschen Ergebnis, einer Annäherung (möglicherweise nahe an der Summengröße, aber höchstwahrscheinlich größer als die tatsächlich gesuchte Größe).

Ich denke, es gibt verschiedene Möglichkeiten, Ihre Frage zu beantworten, aber dies ist meine:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Es findet alle Dateien unter. Verzeichnis (ändern. mit jedem Verzeichnis, das Sie möchten), auch versteckte Dateien sind enthalten und (mit xargs) gibt ihre Namen in einer einzigen Zeile aus, dann erstellt eine detaillierte Liste mit ls -l. Diese (manchmal) riesige Ausgabe wird in Richtung des Befehls cut geleitet, und nur das fünfte Feld ( -f5), bei dem es sich um die Dateigröße in Bytes handelt, wird verwendet und erneut weitergeleitet, xargswodurch wiederum eine einzelne Zeile von Größen erzeugt wird, die durch Leerzeichen getrennt sind. Nehmen Sie nun eine Sed-Magie vor, die jedes Leerzeichen durch ein Pluszeichen ( +) ersetzt und schließlich bc(Basisrechner) die Mathematik durchführt.

Möglicherweise ist eine zusätzliche Optimierung erforderlich, und Sie haben möglicherweise einen lsBefehl, der sich zu lange über die Liste der Argumente beschwert.

ztank1013
quelle
Wenn das Verzeichnis zu groß ist, hängt es lange auf. Versuchen Sie, an Ihrem Home-Verzeichnis zu arbeiten: p
Kit Ho
@KitHo Nun, ich fürchte, es gibt keinen einfachen und schnellen Weg, um ein genaues Ergebnis zu erzielen, ohne jede einzelne Datei zu durchsuchen und ihre Größe hinzuzufügen. Daher hängt die Faulheit des Befehls hauptsächlich davon ab, wie viele Dateien sich unter dem gesuchten Verzeichnis befinden ... Aber ich glaube dort ist Spielraum für Verbesserungen ... schöne Herausforderung!
ztank1013
@KitHo hey da, schau dir die erweiterte Version in meiner Antwort an ... und lass es mich natürlich wissen!
ztank1013
0

Eine weitere einfache Lösung.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

Das Ergebnis wird so aussehen

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

Wenn Sie "du -s" in "du -sh" ändern, wird die vom Menschen lesbare Größe angezeigt, aber wir können diese Methode nicht sortieren.

Ambal
quelle
0

Sie können das Folgende verwenden, um Dateien nach Größe du -h | aufzulisten sort -hr | mehr oder du -h --max-Tiefe = 0 * | sort -hr | Mehr

Ghassan Shawahneh
quelle
0

Ich neige dazu, du auf einfache Weise zu benutzen.

du -sh */ | sort -n

Dies gibt mir eine Vorstellung davon, welche Verzeichnisse am meisten Speicherplatz beanspruchen. Ich kann dann später genauere Suchen durchführen.

Tempo
quelle
Diese Art funktioniert, ignoriert jedoch beim Sortieren die Einheiten für die Größe der Datei.
Benjamin Engwall