Vos attentes sont basées sur DOS Think/Windows Think et sont erronées. Sous MS-DOS, Windows et même quelques autres systèmes d'exploitation IBM/Microsoft, l'expansion des caractères génériques est effectuée par la commande elle-même, et des choses comme la commande /a
à l'option dir
agissent comme des filtres d'attributs lors de l'expansion des caractères génériques. dir
développe les caractères génériques tels que *
que l'interpréteur de commandes lui transmet tel quel, et si /a
est spécifié, il applique les filtres appropriés à ce qui est renvoyé. (Sur certains systèmes d'exploitation, les filtres d'attributs peuvent être donnés à l'appel système pour l'énumération d'un répertoire et le noyau du système d'exploitation, ou ses pilotes de système de fichiers, les applique lui-même).
Sur Unices et sur Linux, l'expansion des caractères génériques est effectuée par le Shell, et ne tient pas compte des permissions. Lorsque, dans le répertoire racine, vous faites
ls \*
ce que le ls
commande elle-même reçoit du Shell est (quelque chose comme)
ls bin home opt var boot dev tmp etc lost+found root usr
Qu'est-ce que la -d
/ --directory
L'option désactiver ce qui se passe normalement ensuite . Ce qui se passe normalement ensuite, c'est que ls
examine chacun de ses arguments à tour de rôle, constate qu'il s'agit de répertoires et décide d'énumérer leur contenu. Pour les arguments qui nomment des fichiers, il se contente d'imprimer les informations relatives au fichier lui-même. Avec l'option -d
les répertoires sont traités comme des fichiers. Ainsi, l'option ls
affiche les informations relatives à chacun des répertoires qui lui sont transmis en tant qu'arguments, comme il le ferait s'il s'agissait de fichiers.
Así que -d
n'est pas une option "imprimer seulement les répertoires". En fait, non seulement cette option n'existe pas, mais en plus il y a ne peut être une telle option. L'expansion des caractères génériques est effectuée par le Shell, et (dans un système POSIX sh
au moins), il n'y a aucun moyen de dire au Shell de vérifier les bits de permission et de type de fichier lorsqu'il développe le fichier. *
dans une liste de noms. Pour obtenir une liste de noms de répertoires seuls, il faut soit utiliser la commande find
comme l'explique ztank1013
ou d'utiliser l'astuce selon laquelle un nom de chemin se terminant par une barre oblique implique l'entrée du répertoire .
, comme l'explique Jin
. ( Jin
Le tour de passe-passe de l'auteur de l'article se termine par l'obtention de l'autorisation d'exercer une activité professionnelle. ls
en recevant les arguments
ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/
parce que le modèle */
correspond en fait à des noms de chemin à deux composants, le second étant vide, et n'est donc pas tout à fait faire ce que l'on souhaitait. En particulier, il traitera les liens symboliques pointant vers des répertoires comme s'il s'agissait de répertoires).
Le comportement des ls -d
sans *
est une extension simple de ce qui précède. Il suffit de savoir une chose de plus sur ls
: Lorsqu'il n'a pas d'arguments, il prend un argument par défaut de .
. Maintenant sans les -d
le comportement susmentionné conduit à l'affichage du contenu du répertoire nommé par l'option .
est énuméré et les informations relatives à son contenu sont affichées. Avec les -d
l'option, le répertoire .
est traité comme s'il s'agissait d'un fichier, et ses propres informations sont affichées, plutôt que d'énumérer son contenu.