Existe-t-il un moyen correct de répertorier les sous-répertoires du répertoire actuel?

10

Je peux trouver les sous-répertoires d'un répertoire en

ls -d -- */

ou

ls -l | grep "^d"

mais les deux semblent indirects, et j'imagine qu'il y aurait un moyen standard de trouver uniquement les répertoires. Existe-t-il une bonne façon de procéder? Et si ce n'est pas le cas, est-ce que l'un ou l'autre entraînera un comportement indésirable sur les cas marginaux? (Liens symboliques, répertoires cachés, etc.)

Eric Wilson
la source

Réponses:

17

La réponse dépendra plus de ce que vous avez l'intention de faire avec la sortie que de ce que vous recherchez. Si vous voulez juste voir une liste de référence visuelle sur le terminal, votre première solution est en fait assez agréable. Si vous souhaitez traiter la sortie, vous devez envisager d'utiliser une autre méthode.

L'une des façons les plus robustes d'obtenir une liste à alimenter dans un autre programme est d'utiliser find.

find -maxdepth 1 -type d

La raison pour laquelle cela est bon pour les flux est qu'il findpeut sortir les données séparées par des valeurs nulles en utilisant -print0ou échapper correctement les chaînes comme arguments vers d'autres programmes utilisant -exec. Pour savoir pourquoi c'est mieux que d'analyser la sortie de ls, voir ParsingLS sur le wiki de Greg.

Caleb
la source
4
J'ai dû taper find . -maxdepth 1 -type dpour que cela fonctionne sur OS X Yosemite.
Sean Levin
1
pour lister les sous-répertoires, il faut également spécifier -mindepth comme dans find . -maxdepth 1 -mindepth 1 -type d. Sinon, le répertoire actuel .sera inclus.
tinlyx
5

Pour votre information - Dans ZSH (mais pas BASH), vous pouvez aussi le faire: ls -d -- *(/); le (/)modificateur indique ZSH uniquement aux répertoires glob.

Cela dit, ce n'est pas très différent de votre propre solution proposée ( ls -d -- */), et c'est loin d'être standard.

En ce qui concerne la sortie de ls(qui diffère probablement en fonction des autres drapeaux):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
Curtis F.
la source
zsh étend l'astérisque à tous les fichiers et répertoires, l'indicateur (/) sélectionne des parties de cette extension afin que ls * (/) fonctionne également, ainsi que echo * (/) , ou d'une manière plus zshly print -l * (/ ) . Les deux premières versions fonctionnent également en bash.
Thor
1
Notez que se *(/)développe dans les répertoires non cachés tandis que se */développe dans les répertoires non cachés ou les liens symboliques vers les répertoires (ou du moins les liens symboliques vers des chemins pour lesquels nous pouvons dire qu'ils sont des répertoires).
Stéphane Chazelas