Il est généralement vrai sur les systèmes Unix que le nombre de liens vers un répertoire est le nombre de sous-répertoires plus 2. Cependant, il y a des cas où ce n'est pas vrai:
Certains unités autorisent les liens durs vers les répertoires. Ensuite, il y aura plus de 2 liens qui ne correspondent pas à des sous-répertoires.
Il existe des systèmes de fichiers où les répertoires n'ont pas d'entrées pour .
et ..
. Le manuel GNU find mentionne quelques exemples dans la discussion de son -noleaf
option (qui désactive une optimisation qui suppose cela .
et qui ..
existe dans tous les répertoires): «Systèmes de fichiers CD-ROM ou MS-DOS ou points de montage de volume AFS»
Un moyen presque fiable de compter le nombre de sous-répertoires (il peut toujours échouer si un nom de fichier contient un caractère de nouvelle ligne) est
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
Un moyen plus fiable utilise des globes shell */
et .*/
; comme d'habitude, gérer le cas où le motif ne correspond pas est un peu pénible (sauf en bash et zsh où vous pouvez activer l' nullglob
option).
Gilles 'SO- arrête d'être méchant'
la source
-type d
, mais: 1. cela nécessite GNU find; 2. vous devez soustraire 1 pour le répertoire de départ (ou passer-mindepth 1
).Ne l'utilisez pas
ls
pour cela . Voici une méthode qui fonctionne avec tous les noms de fichiers, même ceux contenant des retours à la ligne, car elle imprime uniquement un caractère de nouvelle ligne au lieu du nom de fichier:Edit: La version actuelle n'entraîne aucun avertissement, car
-mindepth
et-maxdepth
devrait être antérieure-type
(l'arborescence des répertoires est élaguée avant de rechercher des répertoires, pour gagner du temps).la source