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, pwdet 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 binet sbinchacun 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 lsavec un tube to wc -lest 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' -1option pour activer explicitement le comportement. wc -lcompte 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' -boption ls pour les échapper. ls -1bAimprimera 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 -lpour une ligne de commande complète ls -1bA | wc -lqui rapportera le nombre de fichiers et de répertoires dans le répertoire actuel (mais ignorez .et ..; c'est la différence entre -aet -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 -Aparamètre à ls.