web-dev-qa-db-fra.com

La commande 'ls -d' n'affiche pas les répertoires. Est-il possible d'obtenir que 'ls' affiche uniquement les répertoires au lieu de fichiers et de répertoires?

Existe-t-il un moyen d’obtenir que ls affiche uniquement les répertoires au lieu de fichiers et de répertoires?

De la page de manuel:

   -d, --directory
          list directory entries instead of contents, and do not  derefer‐
          ence symbolic links

Donc, si je le tape dans le répertoire /, je ne verrai que les répertoires. Au lieu de cela, il montre "."

$ cd /
$ ls -d
.

Je m'attendais à ce que ls -d me montre ceci:

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

Existe-t-il un moyen d’obtenir que ls affiche uniquement les répertoires au lieu de fichiers et de répertoires?

44
nelaaro

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, et des éléments tels que l'option /a de la commande dir agissent comme des filtres d'attributs lors du développement des caractères génériques. dir développe les caractères génériques tels que *, que l'interpréteur de commande lui transmet tels quels, 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 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 sous Linux, l’extension des caractères génériques est effectuée par le shell et ignore les autorisations. Quand, dans le répertoire racine, vous faites

ls *

ce que la commande ls 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

Ce que fait -d/--directory est désactiver ce qui se passe normalement ensuite . Ce qui se passe ensuite, c'est que ls examine 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 affiche simplement les informations relatives au fichier lui-même. Avec l'option -d, les répertoires sont traités comme des fichiers. Donc, ls imprime les informations pour chacun des répertoires passés en tant qu'arguments, comme s'il s'agissait de fichiers.

Donc, -d n'est pas une option "répertoires uniquement". En fait, non seulement cette option n’existe pas; il ne peut pas être une telle option. L’exploitation des caractères génériques est effectuée par le shell et (dans une variable 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 développe * dans une liste de noms. Pour obtenir une liste des noms de répertoires uniquement, il est nécessaire d'utiliser la commande find, 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 de répertoire ., comme expliqué par Jin. (Le tour de Jin aboutit à la commande ls qui reçoit les arguments

ls bin/home/opt/var/boot/dev/tmp/etc/lost + found/root/usr /

parce que le modèle */ fait en fait correspondre les chemins d'accès aux noms de chemins avec deux composants, le second étant vide, et donc ne fait pas exactement 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 connaître une dernière chose à propos de ls: Quand aucun argument n’est donné, cela suppose un argument par défaut de .. Maintenant sans l'option -d, le comportement susmentionné conduit à l'énumération du contenu du répertoire nommé par . et à l'affichage des informations relatives à son contenu. Avec l'option -d, 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é.

50
JdeBP

Vous pouvez utiliserls -d */ ou ls -d .*/ pour les répertoires cachés.

30
Jin

Essaye ça

 find . -mindepth 1 -maxdepth 1 -type d

pour obtenir uniquement des répertoires sous votre emplacement actuel.

13
ztank1013

Si vous voulez voir uniquement les répertoires avec des détails comme l'option ls -l (ELL), vous pouvez utiliser ci-dessous:

find -maxdepth 1 -type d -ls;

Les informations ci-dessus ne vous donneront que les détails que vous obtenez avec l'option -l.

5
Adnan Bhatti

Vous pourriez aussi aimer

tree -d 

qui répertorie proprement tous les répertoires et sous-répertoires avec une représentation graphique de la structure arborescente.

5
fuenfundachtzig

Si vous voulez faire le travail d'une autre manière, essayez ceci:

ls -l | grep ^d

Bien qu'un seul outil soit suffisant dans cette situation. Pipe Line est toujours là pour vous aider. J'aime la flexibilité sous Linux, ce que je vous souhaite.

4
Bohr

J'espère que cela rectifiera votre besoin. La commande ci-dessous ne listera que les répertoires d'un chemin donné.

ls -F <path> | grep /

Exemple:

ls -F ~ | grep /
1
Thiyagu ATR