Vos attentes sont basées sur DOS Think/Windows Think et sont erronées. Sur MS-DOS, Windows et 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 le /a option au dir La commande agit comme des filtres d'attributs lors de l'expansion des caractères génériques. dir développe les caractères génériques comme * , 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 énumérer 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 Linux, l'expansion des caractères génériques est effectuée par le shell et ne tient pas compte des autorisations. Lorsque, dans le répertoire racine, vous faites
ls *
qu'est-ce que le ls la 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 le -d /--directory l'option est désactiver ce qui se passe normalement ensuite . Ce qui se passe normalement ensuite est que ls regarde tour à tour chacun de ses arguments, voit qu'il s'agit de répertoires et décide d'énumérer leur contenu. Pour les arguments qui nomment des fichiers, il imprime simplement les informations du fichier lui-même. Avec le -d option, les répertoires sont traités comme des fichiers. Donc ls imprime les informations pour chacun des répertoires qui sont passés en arguments, comme il le ferait s'il s'agissait de fichiers.
Donc -d n'est pas une option "imprimer uniquement les répertoires". En fait, non seulement il n'y a pas une telle option; il ne peut pas y avoir une telle option. L'expansion des caractères génériques est effectuée par le shell et (dans un POSIX sh au moins) il n'y a aucun moyen de dire au shell de vérifier les bits d'autorisation et de type de fichier lorsqu'il développe * dans une liste de noms. Pour obtenir une liste des noms de répertoires seuls, il faut soit utiliser le find commande, comme expliqué par ztank1013 , ou pour utiliser l'astuce qu'un nom de chemin se terminant par une barre oblique implique l'entrée de répertoire . , comme expliqué par Jin . (Jin l'astuce de se termine par le ls commande recevant les arguments
ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/
car le motif */ correspond en fait à des chemins d'accès avec deux composants, le second étant vide, et n'est donc pas tout à fait faire ce qui était désiré. En particulier, il traitera les liens symboliques pointant vers des répertoires 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 de savoir une chose de plus sur ls :Lorsqu'il ne reçoit aucun argument, il suppose un argument par défaut de . . Maintenant sans le -d option, le comportement susmentionné conduit au contenu du répertoire nommé par . en cours d'énumération et les informations relatives à son contenu affichées. Avec le -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é.
Vous pouvez utiliser ls -d */ , ou ls -d .*/ pour les répertoires cachés.
Essayez ceci
find . -mindepth 1 -maxdepth 1 -type d
pour obtenir uniquement les répertoires sous votre emplacement actuel.