Vos attentes sont basées sur DOS Think / Windows Think et sont fausses. Sur MS-DOS, Windows et même sur quelques autres systèmes d'exploitation IBM / Microsoft, le développement des caractères génériques est effectué par la commande elle-même. Des éléments tels que l' /a
option de la dir
commande agissent comme des filtres d'attributs lors du développement des caractères génériques. dir
étend les caractères génériques tels que ceux *
que l'interpréteur de commande lui transmet tels quels, et si /a
spécifié, il applique les filtres appropriés à ce qui est renvoyé. (Sur certains systèmes d'exploitation, les filtres d'attributs peuvent être attribués à l'appel système pour énumérer un répertoire et le noyau du système d'exploitation, ou ses pilotes de système de fichiers, les applique eux-mêmes.)
Sous Unices et Linux, l’extension des caractères génériques est effectuée par le shell et n’est pas liée aux autorisations. Quand, dans le répertoire racine, vous faites
ls *
ce que la ls
commande elle-même reçoit du shell (quelque chose comme)
ls bin accueil opt var démarrage dev tmp etc perdu + racine trouvée usr
L’ option -d
/ désactive ce qui se passe normalement ensuite . Ce qui se passe ensuite ensuite, c’est que chacun de ses arguments est examiné, qu’il s’agit de répertoires et qu’il décide d’énumérer son contenu. Pour les arguments qui nomment des fichiers, il n’imprime que les informations relatives au fichier lui-même. Avec l' option, les répertoires sont traités comme des fichiers. Donc, imprime les informations pour chacun des répertoires qui sont passées en tant qu'arguments, exactement comme s'il s'agissait de fichiers.--directory
ls
-d
ls
Donc, ce -d
n'est pas une option "imprimer uniquement les répertoires". En fait, non seulement cette option n’existe pas; il ne peut y avoir une telle option. L’exploitation des caractères génériques est effectuée par le shell et (dans un POSIX sh
au moins), il n’ya aucun moyen de demander au shell de vérifier les bits d’autorisation et de type de fichier lorsqu’il se développe *
dans une liste de noms. Pour obtenir une liste des noms de répertoires uniquement, il est nécessaire d'utiliser la find
commande, comme expliqué par ztank1013
ou d'utiliser le truc selon lequel un chemin d'accès se terminant par une barre oblique implique l'entrée du répertoire .
, comme expliqué par Jin
. ( Jin
L'astuce finit avec la ls
commande recevant les arguments
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
parce que le modèle */
fait en réalité correspondre les chemins d'accès avec deux composants, le second étant vide, et ne fait donc pas tout à fait ce qui était souhaité. En particulier, les liens symboliques pointant vers des répertoires seront traités comme s'il s'agissait de répertoires.)
Le comportement de ls -d
sans *
est une simple extension de ce qui précède. Il suffit simplement de savoir une dernière chose à propos de ls
: quand aucun argument n’est donné, cela suppose un argument par défaut de .
. Désormais, sans cette -d
option, le comportement susmentionné conduit au contenu du répertoire nommé par .
énumération et à l'affichage des informations relatives à son contenu. Avec l' -d
option, le répertoire .
est traité comme s'il s'agissait d'un fichier et ses propres informations sont affichées, plutôt que son contenu énuméré.