Chaque répertoire sur un système Unix (et probablement tous les autres systèmes aussi) contient au moins deux entrées de répertoire. Ce sont .
(répertoire courant) et ..
(répertoire parent). Dans le cas du répertoire racine, ceux-ci pointent au même endroit, mais avec tout autre répertoire, ils sont différents. Vous pouvez le constater par vous-même en utilisant les commandes stat
, pwd
et cd
(sous Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Notez cela bin
et sbin
chacun a deux liens. L'un est l'entrée de répertoire dans le répertoire racine et l'autre est l' .
entrée dans ce répertoire.
L'utilisation ls
avec un tube to wc -l
est une astuce simple pour compter le nombre de lignes dans la sortie de ls. L'hypothèse est que chaque fichier ou répertoire occupera exactement une ligne dans la sortie. GNU ls le fera automatiquement lorsque la sortie est non terminale; d'autres peuvent avoir besoin de l' -1
option pour activer explicitement le comportement. wc -l
compte et affiche simplement le nombre de lignes ( -l
) dans son entrée.
Le problème avec cette approche est que sous Linux et sur les systèmes de fichiers traditionnellement utilisés sous Linux, les noms de fichiers et de répertoires (ils sont vraiment les mêmes à cet égard) sont autorisés à contenir des caractères de nouvelle ligne . En présence de ceux-ci, l'une ou l'autre méthode s'effondre - ces entrées seront comptées comme deux entrées ou plus alors qu'en réalité elles ne font qu'un.
Tant que vous utilisez GNU ls, n'avez aucune entrée de répertoire avec des noms contenant des caractères de nouvelle ligne, et n'avez pas d'alias impairs pour ls
(par exemple, ls -a
), les deux afficheront le nombre de fichiers et de répertoires dans le répertoire actuel (ou spécifié). Pour la plupart des gens, c'est suffisant, mais ce n'est pas valable dans le cas général .
Si vous devez gérer correctement les caractères inhabituels (principalement les sauts de ligne) dans les noms des entrées de répertoire, je suggère d'utiliser l' -b
option ls pour les échapper. ls -1bA
imprimera chaque nom d'entrée de répertoire sur sa propre ligne, échappera les caractères inhabituels (de sorte que chaque entrée de répertoire sera considérée comme une seule), y compris les fichiers de points et les répertoires. Tack on wc -l
pour une ligne de commande complète ls -1bA | wc -l
qui rapportera le nombre de fichiers et de répertoires dans le répertoire actuel (mais ignorez .
et ..
; c'est la différence entre -a
et -A
), mais ne descendez dans aucun sous-répertoire. Si vous ne voulez pas que les fichiers dot soient comptés dans le total, omettez simplement le -A
paramètre à ls
.