1185 votes

Lister uniquement les répertoires en utilisant ls en Bash ?

Cette commande liste les répertoires dans le chemin d'accès courant : ls -d */

Que fait exactement le modèle */ faire ?

Et comment donner le chemin absolu dans la commande ci-dessus (ex. ls -d /home/alice/Documents ) pour ne lister que les répertoires de ce chemin ?

8 votes

Voir l'édition de cette réponse unix.stackexchange.com/a/75047/32647 expliquant ce que -d signifie en fait.

1238voto

Gordon Davisson Points 22534

*/ est un motif qui correspond à tous les sous-répertoires du répertoire courant ( * correspondrait à tous les fichiers y les sous-répertoires ; le / le restreint aux répertoires). De même, pour lister tous les sous-répertoires sous /home/alice/Documents, utilisez ls -d /home/alice/Documents/*/

113 votes

Notez que */ ne correspondra à aucun dossier caché. Pour les inclure, il faut soit les spécifier explicitement comme ls -d .*/ */ ou fixer le dotglob option dans Bash.

1 votes

@GordonDavisson Le message d'échec pourrait être évité avec l'option bash shopt -s nullglob

6 votes

@BinaryZebra Le fait de définir nullglob éviterait le message d'erreur, mais causerait encore plus de confusion : avec nullglob défini et aucun sous-répertoire, ls */ s'étendrait à juste ls qui listerait tous les fichiers du répertoire courant. Je suis presque sûr que ce n'est pas ce que vous voulez dans ce cas.

579voto

Albert Points 1651

Quatre façons d'y parvenir, chacune avec un format de sortie différent

1. Utilisation de echo

Exemple : echo */ , echo */*/
Voici ce que j'ai obtenu :

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. Utilisation de ls seulement

Exemple : ls -d */
Voici exactement ce que j'ai obtenu :

cs/     files/      masters/  
draft/  hacks/      static/  

Ou sous forme de liste (avec des informations détaillées) : ls -dl */

3. Utilisation de ls y grep

Exemple : ls -l | grep "^d" Voici ce que j'ai obtenu :

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash script (Non recommandé pour les noms de fichiers contenant des espaces)

Exemple : for i in $(ls -d */); do echo ${i%%/}; done
Voici ce que j'ai obtenu :

cs  
draft  
files  
hacks  
masters  
static

Si vous voulez avoir '/' comme caractère de fin, la commande sera : for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

2 votes

NB. 3 était sensiblement plus lent que les autres. Dans le répertoire que j'ai testé : 1 .012s, 2 .016s, 3 .055s , 4 .021s.

0 votes

@isomorphismes, comment avez-vous mesuré le temps ? Par quels moyens ? Au fait, je dois dire que non. 1 est mon préféré.

0 votes

Albert, j'ai utilisé time la fonction Unix. /// Je suis d'accord, echo */ est plus intelligente que ls -d */ .

126voto

J'utilise :

ls -d */ | cut -f1 -d'/'

Cela crée une seule colonne sans slash de fin - utile dans les scripts.

23 votes

El -1 option pour ls s'affichera également en format à une seule colonne, comme dans ls -1 -d */ .

3 votes

@user29020 Il faut noter que -1 produit toujours un slash de fin pour chaque entrée.

0 votes

Lorsque j'ajoute ceci à .bashrc comme alias, comment ajouter '/' ?

77voto

at3m Points 21

Pour tous les dossiers sans sous-dossiers :

find /home/alice/Documents -maxdepth 1 -type d

Pour tous les dossiers avec sous-dossiers :

find /home/alice/Documents -type d

5 votes

Pour correspondre à la question (mais inclure les dotfiles), le premier devrait être : find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d sinon, vous incluez /home/alice/Documents lui-même. Pour inclure des liens symboliques vers des répertoires, préfixez avec -L

0 votes

Cela semble être la solution la plus saine, puisque find est l'outil qui est réellement fait pour cette tâche. Vous pouvez exclure le premier résultat - ./ pour le répertoire actuel - en utilisant grep -v '^ \. /$'

7voto

wholanda Points 1

Pour afficher les listes de dossiers sans / :

ls -d */|sed 's|[/]||g'

2 votes

Ou ls -d1 */ | tr -d "/"

0 votes

Il n'est pas nécessaire d'appeler une commande externe : set -- */; printf "%s\n" "${@%/}"

0 votes

J'aime la solution de @wholanda. Ma solution un peu plus courte est (testée et fonctionne) : ls -d */|sed 's|/|||g'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X