61 votes

Où sont utilisés tous mes inodes?

Comment savoir quels répertoires sont chargés de mâcher tous mes inodes?

En fin de compte, le répertoire racine sera responsable du plus grand nombre d'inodes, donc je ne sais pas exactement quel type de réponse je veux.

Fondamentalement, je suis à court d’inodes disponibles et j’ai besoin de trouver un répertoire inutile pour l’abattage.

Merci et désolé pour la question vague.

90voto

Hannes Points 471

Si vous ne souhaitez pas créer de nouveau fichier (ou ne le pouvez pas car vous n'avez plus d'inodes), vous pouvez exécuter cette requête:

 for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
 

45voto

insider Points 361

Les méthodes fournies avec ls récursives sont très lentes. Juste pour trouver rapidement le répertoire parent qui consomme le plus d’inodes que j’ai utilisés:

 cd /partition_that_is_out_of_inodes
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done | sort -n
 

21voto

Paul Tomblin Points 83687

Donc, fondamentalement, vous cherchez quels répertoires contiennent beaucoup de fichiers? Voici un premier essai:

 find . -type d -print0 | xargs -0 -n1 count_files | sort -n
 

où "count_files" est un script shell qui le fait (merci Jonathan)

 echo $(ls -a "$1" | wc -l) $1
 

11voto

Noah Spurrier Points 339

C'est mon prendre sur elle. Il n'est pas si différent des autres, mais le résultat est joli et je pense que ce qui compte le plus valable pour les inodes que d'autres (les répertoires et les liens symboliques). Compte le nombre de fichiers dans chaque sous-répertoire du répertoire de travail; elle trie et les formats de sortie en deux colonnes; et il imprime un grand total (comme des ".", le répertoire de travail). Ce ne sera pas suivre les liens symboliques, mais va compter les fichiers et les répertoires qui commencent par un point. Cela ne compte pas les nœuds de périphérique et les fichiers spéciaux comme des canaux nommés. Il suffit de retirer le "type l-o -type d -o -type f" test si vous voulez compter ceux, trop. Parce que cette commande est divisée en deux trouver les commandes ne peuvent pas correctement la discrimination contre les répertoires montés sur les autres systèmes de fichiers (l'option de montage ne fonctionnera pas). Par exemple, cela devrait vraiment ignorer "/proc" et "/sys" répertoires. Vous pouvez voir que dans le cas de l'exécution de cette commande dans "/" que dont "/proc" et "/sys" grossièrement fausse le grand comptage total.

for ii in $(find . -maxdepth 1 -type d); do 
    echo -e "${ii}\t$(find "${ii}" -type l -o -type d -o -type f | wc -l)"
done | sort -n -k 2 | column -t

Exemple:

# cd /
# for ii in $(find -maxdepth 1 -type d); do echo -e "${ii}\t$(find "${ii}" -type l -o -type d -o -type f | wc -l)"; done | sort -n -k 2 | column -t
./boot        1
./lost+found  1
./media       1
./mnt         1
./opt         1
./srv         1
./lib64       2
./tmp         5
./bin         107
./sbin        109
./home        146
./root        169
./dev         188
./run         226
./etc         1545
./var         3611
./sys         12421
./lib         17219
./proc        20824
./usr         56628
.             113207

6voto

Alnitak Points 143355

Voici un simple script Perl qui le fera:

 #!/usr/bin/perl -w

use strict;

sub count_inodes($);
sub count_inodes($)
{
  my $dir = shift;
  if (opendir(my $dh, $dir)) {
    my $count = 0;
    while (defined(my $file = readdir($dh))) {
      next if ($file eq '.' || $file eq '..');
      $count++;
      my $path = $dir . '/' . $file;
      count_inodes($path) if (-d $path);
    }
    closedir($dh);
    printf "%7d\t%s\n", $count, $dir;
  } else {
    warn "couldn't open $dir - $!\n";
  }
}

push(@ARGV, '.') unless (@ARGV);
while (@ARGV) {
  count_inodes(shift);
}
 

Si vous voulez que cela fonctionne comme du (où chaque compte de répertoire inclut également le compte récursif du sous-répertoire), changez la fonction récursive en return $count puis, au point de récursivité, dites:

 $count += count_inodes($path) if (-d $path);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X