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.