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?
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é.
Vous pouvez utiliserls -d */
ou ls -d .*/
pour les répertoires cachés.
Essaye ça
find . -mindepth 1 -maxdepth 1 -type d
pour obtenir uniquement des répertoires sous votre emplacement actuel.
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
.
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.
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.
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 /