Erwarten Sie nicht, dass es schnell gehen wird ...
cd in ein Verzeichnis, in dem sich vermutlich ein Unterverzeichnis mit vielen Inodes befindet. Wenn dieses Skript sehr viel Zeit in Anspruch nimmt, haben Sie wahrscheinlich herausgefunden, wo Sie im Dateisystem nachsehen müssen. / var ist ein guter Anfang ...
Andernfalls finden Sie das Verzeichnis mit allen Inodes, wenn Sie in das oberste Verzeichnis in diesem Dateisystem wechseln und dieses ausführen und warten, bis es fertig ist.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Ich mache mir keine Sorgen über die Kosten für das Sortieren. Ich habe einen Test durchgeführt und das Durchsuchen der unsortierten Ausgabe von 350.000 Verzeichnissen dauerte 8 Sekunden. Der erste Fund dauerte. Die tatsächlichen Kosten sind das Öffnen aller dieser Verzeichnisse in der while-Schleife. (Die Schleife selbst dauert 22 Sekunden). (Die Testdaten wurden in einem Unterverzeichnis mit 350.000 Verzeichnissen ausgeführt, von denen eines eine Million Dateien enthielt, der Rest zwischen 1 und 15 Verzeichnisse).
Verschiedene Leute hatten darauf hingewiesen, dass ls darin nicht großartig ist, weil es die Ausgabe sortiert. Ich hatte echo ausprobiert, aber das ist auch nicht so toll. Jemand anderes hatte darauf hingewiesen, dass stat diese Information (Anzahl der Verzeichniseinträge) angibt, diese aber nicht portierbar ist. Es stellt sich heraus, dass find -maxdepth sehr schnell Verzeichnisse öffnet und .files zählt, also ... hier ist es ... Punkte für alle!
Wenn es sich bei dem Problem um ein Verzeichnis mit zu vielen Dateien handelt, ist dies eine einfache Lösung:
Die Idee dahinter
find
ist, dass die Größe eines Verzeichnisses proportional zur Anzahl der Dateien ist, die sich direkt in diesem Verzeichnis befinden. Hier suchen wir also nach Verzeichnissen mit Tonnen von Dateien.Wenn Sie keine Zahl erraten möchten und alle verdächtigen Verzeichnisse nach "Größe" sortieren möchten, ist dies ebenfalls ganz einfach:
quelle
Grrr, das Kommentieren erfordert 50 Wiederholungen. Diese Antwort ist eigentlich ein Kommentar zu Chris 'Antwort.
Da dem Fragesteller wahrscheinlich nicht alle Verzeichnisse wichtig sind, sondern nur die schlechtesten, ist die Verwendung von sort wahrscheinlich sehr teuer.
Dies ist nicht so vollständig wie Ihre Version, aber dies bewirkt, dass Zeilen gedruckt werden, wenn sie größer als das vorherige Maximum sind, wodurch die Menge der ausgedruckten Geräusche erheblich reduziert und die Kosten für die Sortierung gespart werden.
Der Nachteil davon ist, wenn Sie 2 sehr große Verzeichnisse haben und das erste zufällig 1 mehr Inode als das zweite hat, werden Sie das zweite nie sehen.
Eine vollständigere Lösung wäre, ein intelligenteres Perl-Skript zu schreiben, das die Top-10-Werte protokolliert und diese am Ende ausgibt. Aber das ist zu lang für eine schnelle Antwort auf einen Serverfehler.
Außerdem können Sie mit einem etwas schlaueren Perl-Skript die while-Schleife überspringen - auf den meisten Plattformen sortiert ls die Ergebnisse, was auch für große Verzeichnisse sehr teuer sein kann. Die Sortierung ls ist hier nicht erforderlich, da uns nur die Zählung am Herzen liegt.
quelle
Sie können dieses kleine Snippet verwenden:
Es wird gedruckt, wie viele Dateien und Verzeichnisse sich in jedem der Verzeichnisse im aktuellen Ordner befinden, wobei die größten Straftäter unten stehen. Es wird Ihnen helfen, Verzeichnisse mit vielen Dateien zu finden. ( mehr info )
quelle
Dies ist keine direkte Antwort auf Ihre Frage, aber die Suche nach kürzlich geänderten Dateien mit einer geringen Größe mithilfe von find kann Ihre Suche einschränken:
quelle
Es werden keine Dateien gefunden, deren Namen mit einem Punkt beginnen. Die Verwendung von find vermeidet dies. Dadurch wird jede Datei in der Verzeichnisstruktur gefunden, der Basisname am Ende jedes Pfads entfernt und die Häufigkeit gezählt, mit der jeder Verzeichnispfad in der resultierenden Ausgabe angezeigt wird. Möglicherweise müssen Sie das "!" in Anführungszeichen, wenn sich Ihre Shell darüber beschwert.
Inodes können auch von Dateien verwendet werden, die gelöscht wurden, aber von einem laufenden Prozess geöffnet werden. Wenn dieses Munin-Paket ständig laufende Programme enthält, müssen Sie außerdem prüfen, ob ungewöhnlich viele Dateien geöffnet sind.
quelle
Ich würde dieses brutale Vorgehen erzwingen: Führe eine Tripwire-Prüfung auf dem gesamten Gerät durch, um eine Basislinie zu erhalten, und führe einige Zeit später eine Überprüfung durch.
quelle
(nicht in der Lage zu sein, zu kommentieren, ist wirklich in die Jahre gekommen - das ist für egorgry)
egorgry - ls -i gibt die Inode-NUMMER für einen Eintrag aus, nicht den Inode-COUNT.
Versuchen Sie es mit einer Datei in Ihrem Verzeichnis - Sie werden (wahrscheinlich) eine ebenso hohe Zahl sehen, aber es ist nicht die Anzahl der Inodes, sondern nur die # Inode, auf die Ihr Verzeichniseintrag verweist.
quelle
Aktualisieren
Ein Einzeiler, der die Inode-Anzahl jedes untergeordneten Elements des angegebenen Verzeichnisses mit den größten Einträgen unten zurückgibt.
Ursprüngliche Antwort
Führen Sie es so aus (vorausgesetzt, das obige Skript befindet sich in einer ausführbaren Datei in Ihrem Arbeitsverzeichnis)
quelle
Die Inode-Nutzung beträgt ungefähr eine pro Datei oder Verzeichnis, richtig? Dann mach's
um ungefähr zu zählen, wie viele Inodes unter [Pfad] verwendet werden.
quelle
Ich habe versucht, eine effiziente Shell-Pipeline zu schreiben, diese wurde jedoch unhandlich und entweder langsam oder ungenau.
listet Blattverzeichnisse (und einige andere) mit mehr als 1000 Dateien auf. Also, hier ist ein Perl-Skript, um es sowohl in der Zeit als auch im RAM effizient zu machen. Ausgabe ist wie
«Files-in-subtree» «files-direkt-im-verzeichnis» «verzeichnisname»
So können Sie es einfach mit normalen Werkzeugen wie oben beschrieben massieren und filtern (1) oder awk (1).
quelle
Mein Zuhause auf meinem Laptop benutzt 131191 Inodes.
quelle