web-dev-qa-db-fra.com

Comment lister les dossiers en utilisant les commandes bash?

Est-il possible de répertorier uniquement les dossiers d'un répertoire à l'aide de commandes bash? (car la commande ls répertorie tous les fichiers et dossiers)

52
SpiXel

Vous pouvez utiliser:

ls -d -- */

Tous les répertoires se terminant par /, seuls les répertoires du chemin actuel sont listés. L'option -d garantit que seuls les noms de répertoires sont imprimés, pas leur contenu.

64
3498DB

La réponse de Stephen Martin a donné un avertissement et a également répertorié le dossier actuel. Je suggère donc

find . -mindepth 1 -maxdepth 1 -type d

(Ceci est sous Linux; je n'ai pas pu trouver -maxdepth et -mindepth dans la page de manuel POSIX pour trouver)

28
daniel kullmann
find . -maxdepth 1 -type d

Ne listera que les dossiers. Et comme Teddy l'a fait remarquer, vous aurez besoin de -maxdepth pour l'empêcher de se retrouver dans les sous-répertoires.

12
0x7c0

La réponse de Daniel est correcte. Voici quelques ajouts utiles, cependant.

Pour éviter de lister les dossiers cachés (comme .git), essayez ceci:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

Et pour remplacer la barre oblique redoutée au début de la sortie de find dans certains environnements, utilisez ceci:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'
6
Mathias Bynens

Vous n'êtes "pas censé" analyser la sortie de ls, ou c'est ce qu'on dit. Le raisonnement derrière est que le résultat est conçu pour être lisible par l'homme et que cela peut compliquer inutilement l'analyse, si je me souviens bien.

si vous ne voulez ni ls ni find, vous pouvez essayer de filtrer "*" avec "[-d]".

C’est ce que j’ai fait, pour une raison ou une autre et que ma recherche ne fonctionnait pas (noms de fichiers avec des espaces et des crochets, je suppose, ou quelque chose que j’ignorais),

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
1

printf "%s\n" */ listera tous les répertoires du $ PWD.

echo */ fonctionnera également, mais sur une longue ligne, plus difficile lorsque les noms ont des espaces.

0
user353322
0
Steven Penny

Juste pour souligner une chose qui m'a dérouté ici, en ce qui concerne la sélection de modèles globaux; dites que vous avez ceci:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

Donc, disons que vous voulez sélectionner uniquement les répertoires mydir*. Notez que si vous laissez de côté la barre oblique finale, ls -d liste également les fichiers:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... cependant, avec une barre oblique finale, seuls les répertoires sont listés:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/
0
sdaau