Lösung 1:
Erwarten Sie nicht, dass dies schnell abläuft...
cd in ein Verzeichnis, in dem Sie vermuten, dass es ein Unterverzeichnis mit vielen Inodes gibt. Wenn dieses Skript viel Zeit in Anspruch nimmt, haben Sie wahrscheinlich herausgefunden, wo Sie im Dateisystem suchen müssen. /var ist ein guter Anfang...
Andernfalls, wenn Sie in das oberste Verzeichnis in diesem Dateisystem wechseln und dies ausführen und warten, bis es beendet ist, finden Sie das Verzeichnis mit allen Inodes.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Über die Sortierkosten mache ich mir keine Gedanken. Ich habe einen Test durchgeführt und das Sortieren der unsortierten Ausgabe von 350.000 Verzeichnissen dauerte 8 Sekunden. Der erste Fund dauerte . Der eigentliche Aufwand besteht darin, all diese Verzeichnisse in der While-Schleife zu öffnen. (die Schleife selbst dauert 22 Sekunden). (Die Testdaten wurden auf einem Unterverzeichnis mit 350.000 Verzeichnissen ausgeführt, von denen eines eine Million Dateien hatte, der Rest zwischen 1 und 15 Verzeichnissen).
Verschiedene Leute haben darauf hingewiesen, dass ls darin nicht besonders gut ist, weil es die Ausgabe sortiert. Echo hatte ich probiert, aber das ist auch nicht so toll. Jemand anderes hatte darauf hingewiesen, dass stat diese Informationen (Anzahl der Verzeichniseinträge) liefert, aber nicht portierbar ist. Es stellt sich heraus, dass find -maxdepth beim Öffnen von Verzeichnissen sehr schnell ist und .files zählt, also ... hier ist es ... Punkte für alle!
Lösung 2:
Wenn das Problem ein Verzeichnis mit zu vielen Dateien ist, gibt es hier eine einfache Lösung:
# Let's find which partition is out of inodes:
$ df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 2.4M 2.4M 0 100% /
...
# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d
Die Idee hinter dem find
Linie ist, dass die Größe eines Verzeichnisses proportional zur Menge der Dateien direkt in diesem Verzeichnis ist. Hier suchen wir also nach Verzeichnissen mit Tonnen von Dateien darin.
Wenn Sie keine Zahl erraten möchten und lieber alle verdächtigen Verzeichnisse nach "Größe" sortiert auflisten möchten, ist das auch ganz einfach:
# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n
Lösung 3:
Grrr, das Kommentieren erfordert 50 Wiederholungen. Diese Antwort ist also eigentlich ein Kommentar zu Chris' Antwort.
Da sich der Fragesteller wahrscheinlich nicht um alle Verzeichnisse kümmert, sondern nur um die schlechtesten, ist die Verwendung von sort wahrscheinlich ein sehr teurer Overkill.
find . -type d |
while
read line
do
echo "$(ls "$line" | wc -l) $line"
done |
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]' | less
Dies ist nicht so vollständig wie Ihre Version, aber es druckt Zeilen, wenn sie größer als das vorherige Maximum sind, wodurch das ausgedruckte Rauschen stark reduziert und die Kosten für das Sortieren gespart werden.
Der Nachteil davon ist, wenn Sie 2 sehr große Verzeichnisse haben und das erste zufällig 1 Inode mehr hat als das zweite, werden Sie das zweite nie sehen.
Eine vollständigere Lösung wäre, ein intelligenteres Perl-Skript zu schreiben, das die Top 10 der gesehenen Werte verfolgt und diese am Ende ausdruckt. Aber das ist zu lang für eine schnelle Antwort auf einen Serverfehler.
Außerdem können Sie mit einigen halbwegs intelligenteren Perl-Skripten die While-Schleife überspringen - auf den meisten Plattformen sortiert ls die Ergebnisse, und das kann für große Verzeichnisse auch sehr teuer werden. Die ls-Sortierung ist hier nicht erforderlich, da uns nur die Anzahl interessiert.
Lösung 4:
Sie können dieses kleine Snippet verwenden:
find | cut -d/ -f2 | uniq -c | sort -n
Es wird ausgedruckt, wie viele Dateien und Verzeichnisse sich in jedem der Verzeichnisse im aktuellen Ordner befinden, wobei die größten Übeltäter ganz unten stehen. Es hilft Ihnen, Verzeichnisse mit vielen Dateien zu finden. (mehr Infos)
Lösung 5:
Dies ist keine direkte Antwort auf Ihre Frage, aber die Suche nach kürzlich geänderten Dateien mit geringer Größe mithilfe von find kann Ihre Suche einschränken:
find / -mmin -10 -size -20k