Ne vous attendez pas à ce que cela fonctionne rapidement ...
cd dans un répertoire où vous pensez qu'il pourrait y avoir un sous-répertoire avec beaucoup d'inodes. Si ce script prend énormément de temps, vous avez probablement trouvé où chercher dans le système de fichiers. / var est un bon début ...
Sinon, si vous passez au répertoire supérieur de ce système de fichiers et l'exécutez et attendez qu'il se termine, vous trouverez le répertoire avec tous les inodes.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Je ne m'inquiète pas du coût du tri. J'ai effectué un test et le tri de la sortie non triée de celle-ci sur 350 000 répertoires a pris 8 secondes. La découverte initiale a pris. Le véritable coût est d'ouvrir tous ces répertoires dans la boucle while. (la boucle elle-même prend 22 secondes). (Les données de test ont été exécutées sur un sous-répertoire avec 350 000 répertoires, dont l'un avait un million de fichiers, le reste avait entre 1 et 15 répertoires).
Diverses personnes ont fait remarquer que ls n'est pas génial car il trie la sortie. J'avais essayé l'écho, mais ce n'est pas génial non plus. Quelqu'un d'autre avait fait remarquer que stat donne cette information (nombre d'entrées de répertoire) mais qu'elle n'est pas portable. Il s'avère que find -maxdepth est vraiment rapide pour ouvrir des répertoires et compte les fichiers. Donc, ici, c'est .. des points pour tout le monde!
Si le problème concerne un répertoire contenant trop de fichiers, voici une solution simple:
L'idée derrière la
find
ligne est que la taille d'un répertoire est proportionnelle à la quantité de fichiers directement à l'intérieur de ce répertoire. Nous recherchons donc ici des répertoires contenant des tonnes de fichiers.Si vous ne voulez pas deviner un nombre et que vous préférez répertorier tous les répertoires suspects classés par "taille", rien de plus simple:
la source
Grrr, commenter nécessite 50 répétitions. Donc, cette réponse est en fait un commentaire sur la réponse de Chris.
Étant donné que le questionneur ne se soucie probablement pas de tous les répertoires, seulement des pires, alors l'utilisation du tri est probablement une exagération très coûteuse.
Ce n'est pas aussi complet que votre version, mais cela permet d'imprimer des lignes si elles sont plus grandes que le maximum précédent, ce qui réduit considérablement la quantité de bruit imprimé et économise les dépenses de tri.
L'inconvénient est que si vous avez 2 très gros répertoires et que le premier a 1 inode de plus que le 2e, vous ne verrez jamais le 2e.
Une solution plus complète serait d'écrire un script perl plus intelligent qui garde une trace des 10 premières valeurs vues et les imprime à la fin. Mais c'est trop long pour une réponse rapide de panne de serveur.
De plus, certains scripts perl moyennement plus intelligents vous permettraient de sauter la boucle while - sur la plupart des plates-formes, ls trie les résultats, et cela peut également être très coûteux pour les grands répertoires. Le tri ls n'est pas nécessaire ici, car nous nous soucions uniquement du nombre.
la source
Vous pouvez utiliser ce petit extrait:
Il affichera le nombre de fichiers et de répertoires dans chacun des répertoires du dossier actuel, avec les plus grands délinquants en bas. Il vous aidera à trouver des répertoires contenant de nombreux fichiers. ( plus d'infos )
la source
Ce n'est pas une réponse directe à votre question, mais la recherche de fichiers récemment modifiés avec une petite taille en utilisant find peut affiner votre recherche:
la source
ls ne trouvera pas les fichiers dont les noms commencent par un point. L'utilisation de find évite cela. Cela trouve chaque fichier dans l'arborescence de répertoires, supprime le nom de base à la fin de chaque chemin et compte le nombre de fois que chaque chemin de répertoire apparaît dans la sortie résultante. Vous devrez peut-être mettre le "!" entre guillemets si votre shell s'en plaint.
Les inodes peuvent également être utilisés par des fichiers qui ont été supprimés mais qui sont maintenus ouverts par un processus en cours. Si ce paquet Munin comprend des programmes en cours d'exécution, une autre chose à vérifier est de savoir s'il contient un nombre inhabituel de fichiers.
la source
Je forcerais celui-ci: exécutez tripwire sur l'ensemble de l'appareil pour une ligne de base, puis exécutez une vérification quelque temps plus tard et le répertoire incriminé ressortira comme un pouce endolori.
la source
(ne pas pouvoir commenter devient vraiment vieux - c'est pour l'égorgie)
egorgry - ls -i affiche l'inode NUMBER pour une entrée, pas l'inode COUNT.
Essayez-le avec un fichier dans votre répertoire - vous verrez (probablement) un nombre tout aussi élevé, mais ce n'est pas le nombre d'inodes, c'est juste l'inode # vers lequel pointe votre entrée de répertoire.
la source
Mise à jour
Un liner qui renvoie le nombre d'inodes de chaque enfant d'un répertoire donné avec les entrées les plus importantes en bas.
Réponse originale
Exécutez-le comme ceci (étant donné que le script ci-dessus réside dans un fichier exécutable dans votre répertoire de travail)
la source
l'utilisation d'inode est d'environ une par fichier ou répertoire, non? Alors faites
pour compter approximativement le nombre d'inodes utilisés sous [chemin].
la source
J'ai essayé d'écrire un pipeline shell efficace, mais il est devenu lourd et lent ou inexact, par exemple,
répertorie les répertoires feuilles (et certains autres) contenant plus de 1 000 fichiers. Voici donc un script Perl pour le faire efficacement en temps et en RAM. La sortie est comme
«Fichiers-dans-sous-arbre» «fichiers-directement-dans-répertoire» «nom-répertoire»
vous pouvez donc le masser et le filtrer facilement à l'aide d'outils normaux, par exemple, tri (1) ou awk (1) comme ci-dessus.
la source
ma maison sur mon ordinateur portable utilise des inodes 131191.
la source