GNU/Linux >> Tutoriels Linux >  >> Linux

Déterminer l'emplacement de l'utilisation de l'inode

Solution 1 :

Ne vous attendez pas à ce que cela s'exécute 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 que vous l'exécutez et que vous 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 cela contre 350 000 répertoires a pris 8 secondes. La découverte initiale a pris . Le vrai 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 contenait 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 dans ce domaine 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 très rapide pour ouvrir des répertoires et compte les .files, alors... voilà... des points pour tout le monde !

Solution 2 :

Si le problème est un répertoire avec trop de fichiers, voici une solution simple :

# 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

L'idée derrière le find ligne est que la taille d'un répertoire est proportionnelle à la quantité de fichiers directement à l'intérieur de ce répertoire. Donc, ici, nous recherchons des répertoires contenant des tonnes de fichiers.

Si vous ne voulez pas deviner un nombre et préférez lister tous les répertoires suspects classés par "taille", c'est aussi facile :

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

Solution 3 :

Grrr, commenter nécessite 50 répétitions. Cette réponse est donc 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, l'utilisation du tri est probablement excessivement coûteuse.

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

Ce n'est pas aussi complet que votre version, mais cela imprime des lignes si elles sont plus grandes que le maximum précédent, réduisant considérablement la quantité de bruit imprimée et économisant les frais de tri.

L'inconvénient est que si vous avez 2 très grands répertoires, et que le premier a 1 inode de plus que le 2ème, vous ne verrez jamais le 2ème.

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 à une erreur de serveur.

En outre, certains scripts perl moyennement plus intelligents vous permettraient d'ignorer 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, puisque tout ce qui nous intéresse est le nombre.

Solution 4 :

Vous pouvez utiliser ce petit extrait :

find | cut -d/ -f2 | uniq -c | sort -n

Il imprimera le nombre de fichiers et de répertoires dans chacun des répertoires du dossier actuel, avec les plus gros délinquants en bas. Il vous aidera à trouver des répertoires contenant de nombreux fichiers. (plus d'infos)

Solution 5 :

Ce n'est pas une réponse directe à votre question, mais la recherche de fichiers récemment modifiés avec une petite taille à l'aide de la recherche peut affiner votre recherche :

find / -mmin -10 -size -20k

Linux
  1. Trouver des fichiers et des répertoires sous Linux comme un pro

  2. Trouvez les fichiers et répertoires les plus volumineux sous Linux

  3. Trouver les plus gros fichiers ou répertoires ?

  4. Comment boucler sur des répertoires sous Linux?

  5. Comment trouver uniquement des répertoires sans sous-répertoires ?

Rechercher la commande sous Linux (Rechercher des fichiers et des répertoires)

Comment trouver les principaux processus en cours d'exécution par utilisation de la mémoire

Comment rechercher et supprimer des répertoires vides sous Linux

Trouvez facilement des fichiers et des répertoires sur Linux

Comment diminuer l'utilisation d'inode dans CPanel ?

Comment puis-je trouver l'emplacement MySQL my.cnf