Wie kann ich find
eine Liste von Verzeichnissen erstellen, die die meisten Dateien enthalten? Ich möchte, dass die Liste von der höchsten zur niedrigsten geht. Ich möchte nur, dass die Auflistung eine Ebene tiefer geht, und ich führe diesen Befehl normalerweise von oben in meinem Dateisystem aus, dh /
.
21
Antworten:
Verwenden von GNU-Tools:
Dies verwendet zwei
find
Befehle. Der erste findet Verzeichnisse und leitet sie an einewhile
Schleife weiter. Der nächste Suchvorgang wird für jedes Verzeichnis ausgeführt. Die zweite listet alle untergeordneten Dateien / Verzeichnisse auf der ersten Ebene auf, währendgrep
sie gezählt werden. Dasgrep
erlaubt-print0
, mit dem zweiten Fund verwendet zu werden, dawc
kein-z
Äquivalent vorhanden ist. Dies verhindert, dass Dateinamen mit einer neuen Zeile zweimal gezählt werden (obwohl die Verwendung vonwc
und no-print0
keinen großen Unterschied macht).Das Ergebnis der Sekunde
find
wird in das Argument to eingefügt ,echo
sodass der Verzeichnisname problemlos in dieselbe Zeile$(..)
eingefügt werden kann (das Konstrukt schneidet die neue Zeile am Ende von automatisch abgrep
). Die Zeilen werden dann nach Nummer sortiert und die 50 größten Zahlen mit angezeigthead
.Beachten Sie, dass dies auch die Verzeichnisse der Mount-Punkte der obersten Ebene einschließt. Eine einfache Möglichkeit, dies zu umgehen, besteht darin, ein Bind-Mount zu verwenden und dann das Verzeichnis des Mount zu verwenden. Um dies zu tun:
Eine portablere Lösung verwendet für jedes Verzeichnis eine andere Shell-Instanz (auch hier beantwortet ):
Beispielausgabe:
quelle
UPDATE: Ich habe das alles unten gemacht, was cool ist, aber ich habe mir eine bessere Methode ausgedacht, um Verzeichnisse nach Inode-Verwendung zu sortieren:
Und wenn Sie im selben Dateisystem bleiben möchten, tun Sie Folgendes:
Hier ist ein Beispiel für eine Ausgabe:
JETZT MIT LS:
Einige Personen gaben an, dass sie keine aktuellen coreutils haben und die Option --inodes für sie nicht verfügbar ist. Also, hier ist ls:
Dies liefert mir ziemlich identische Ergebnisse wie der
du
Befehl:DU:
LS:
Ich denke, die
include
Sache hängt nur davon ab, auf welches Verzeichnis das Programm zuerst schaut - weil sie die gleichen Dateien und fest verbunden sind. Irgendwie gefällt mir das Ding oben. Ich könnte mich jedoch irren - und ich begrüße die Korrektur ...Die zugrunde liegende Methode ist, dass ich jeden
ls
Dateinamen durch den darin enthaltenen Verzeichnisnamen ersetze.sed.
Darauf aufbauend ... Nun, ich bin selbst ein bisschen verschwommen. Ich bin mir ziemlich sicher, dass die Dateien genau gezählt werden, wie Sie hier sehen können:DU DEMO
Erstellen Sie ein Testverzeichnis:
Einige Kinderverzeichnisse:
Machen Sie einige Dateien:
Einige Hardlinks:
Schauen Sie sich die Hardlinks an:
Sie werden alleine gezählt, gehen aber ein Verzeichnis hoch ...
Dann habe ich mein Skript von unten ausgeführt und:
Und Graemes:
Ich denke, das zeigt, dass der einzige Weg, Inodes zu zählen, der Inode ist. Und weil das Zählen von Dateien das Zählen von Inodes bedeutet, können Sie Inodes nicht doppelt zählen - um Dateien genau zu zählen, können Inodes nicht mehr als einmal gezählt werden.
ALT:
Ich finde das schneller und es ist portabel:
Es muss nicht
-exec
für jedes Verzeichnis gelten - es werden nur der einesh
und der eine Ell-Prozess verwendetfind
. Ich muss noch dasset -- $glob
Recht bekommen ,.hidden
Dateien und alles andere einzuschließen, aber es ist sehr nah und sehr schnell. Du würdest einfachcd
in was auch immer dein Root-Verzeichnis sein soll für die Prüfung und los geht's.Hier ist ein Beispiel meiner Ausgabe von
/usr
:Ich benutze dort auch
sed
am unteren Rand, um es auf die oberen 50 Ergebnisse zu trimmen.head
wäre natürlich schneller, aber ich schneide bei Bedarf auch jede Zeile zu:Zugegeben, es ist grob, aber es war ein Gedanke. Ein anderes rohes Gerät, das ich benutze, ist das Dumping
2>stderr
für beidefind
undcd
in2>/dev/null
. Es ist nur sauberer, als sich Berechtigungsfehler für Verzeichnisse anzusehen, die ich ohne Root-Zugriff nicht lesen kann - vielleicht sollte ich das spezifizierenfind
. Nun, es ist eine laufende Arbeit.Ok, also habe ich die Shell-Globs folgendermaßen repariert:
Eigentlich wollte ich eine Frage stellen, wie es gemacht werden könnte, aber als ich den Fragentitel eintippte, verwies mich die Site auf eine vorgeschlagene verwandte Frage , in die Stephane bereits eingewogen hatte . Das war praktisch. Anscheinend ist es
[^.],
zwar gut unterstützt, aber nicht tragbar und man muss das benutzen, was!bang.
ich in Stephanes Kommentar dort gefunden habe.Auf jeden Fall war es offensichtlich nicht genug, nur versteckte Dateien einzulesen. Ich muss also
set
zweimal suchen, um zu vermeiden, dass nach dem Wortlaut gesucht wird$glob
. Trotzdem scheint es die Leistung überhaupt nicht zu beeinträchtigen, und es fügt zuverlässig jede Datei im Verzeichnis hinzu.quelle
ls -i
und ... ich denke ... wahrscheinlichgrep
... vielleicht - nun, du verwendest-xdev,
was ein Anfang ist ...uniq
undsort
?du
läufst du? Meinerdu
hat keine--inodes
Option.Warum nicht so etwas wie KDirStat verwenden? Obwohl es ursprünglich für KDE geschrieben wurde, aber auch mit GNOME gut funktioniert. Es gibt Ihnen die beste Sicht auf die Anzahl der Dateien / Verzeichnisse und die jeweilige Verwendung in der GUI
quelle