J'ai trouvé du --inodes
utile, mais je ne sais pas quelle version de du
cela requiert. Sur Ubuntu 17.10, les opérations suivantes :
du --inodes # all files and subdirectories
du --inodes -s # summary
du --inodes -d 2 # depth 2 at most
Combiner avec | sort -nr
pour trier par ordre décroissant du nombre d'inodes contenants.
Le moyen le plus simple semble être find /path/to/search -ls | wc -l
Find est utilisé pour parcourir tous les fichiers et dossiers.
-ls
pour lister (imprimer) tous les noms. Il s'agit d'une valeur par défaut et si vous l'omettez, cela fonctionnera toujours de la même manière sur presque tous les systèmes. (Presque, car certains peuvent avoir des valeurs par défaut différentes). C'est une bonne habitude de l'utiliser explicitement.
Si vous utilisez simplement le find /path/to/search -ls
partie, il imprimera tous les fichiers et répertoires sur votre écran.
wc
est le nombre de mots. le -l
option lui dit de compter le nombre de lignes.
Vous pouvez l'utiliser de plusieurs manières, par exemple
- fichier de test wc
- fichier de test cat | toilettes
La première option permet à wc d'ouvrir un fichier et de compter le nombre de lignes, de mots et de caractères dans ce fichier. La deuxième option fait la même chose mais sans nom de fichier, elle lit à partir de stdin.
Vous pouvez combiner des commandes avec un tube |
. La sortie de la première commande sera redirigée vers l'entrée de la deuxième commande. Ainsi find /path/to/search -ls | wc -l
utilise find pour répertorier tous les fichiers et répertoires et envoie la sortie à wc. Wc compte ensuite le nombre de lignes.
(Une autre alternative aurait été `ls | wc', mais find est beaucoup plus flexible et un bon outil pour apprendre.)
[Modifier après commentaire]
Il peut être utile de combiner la recherche et l'exécution.
Par exemple. find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;
listera tous les répertoires dans /, à l'exception de ceux que vous ne souhaitez pas rechercher. Nous pouvons déclencher la commande précédente sur chacun d'eux, donnant une somme de fichiers par dossier dans /.
Cependant :
- Cela utilise l'extension spécifique GNU -maxdepth.
Cela fonctionnera sur Linux, mais pas sur n'importe quel Unix-a-alike. - Je suppose que vous pourriez en fait vouloir un certain nombre de fichiers pour chaque sous-répertoire.
Le script PHP suivant fait l'affaire.
#!/usr/bin/php
<?php
function do_scan($dir, $dev) {
$total = 1;
if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
foreach (\scandir($dir) as $file) {
if ($file !== '.' && $file !== '..') {
$total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
}
}
print "$total\t$dir\n";
}
return $total;
};
foreach (\array_slice($argv, 1) as $arg) {
do_scan($arg, \lstat($arg)['dev']);
}
Mettez cela dans un fichier (par exemple, "treesize
"), chmod +x
et exécutez-le avec ./treesize . | sort -rn | less
.