Comment lister les dossiers en utilisant les commandes bash?

52

Est-il possible de répertorier uniquement les dossiers d'un répertoire à l'aide de commandes bash? (comme la lscommande liste tous les fichiers et dossiers)

SpiXel
la source

Réponses:

66

Vous pouvez utiliser:

ls -d -- */

Etant donné que tous les répertoires se terminent par /, cela ne répertorie que les répertoires du chemin actuel. L' option -d garantit que seuls les noms de répertoire sont imprimés, pas leur contenu.

Gaffe
la source
2
ls - * / liste tous les répertoires avec leur contenu ci
Vins
2
@ 8088 Quelle est la différence entre ls -d -- */et ls -d */?
Louis
5
@Louis --est traditionnellement utilisé pour marquer la fin des options, de sorte que si un fichier est nommé, -lls ne l'interprète pas comme une option de formatage de liste longue.
Cristian Ciupitu
29

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 ne pouvais pas trouver -maxdepth et -mindepth dans la page de manuel POSIX pour find)

daniel kullmann
la source
1
Une question plus ancienne que je connais. Bien que, dans un premier temps, je me tourne aussi vers cette tâche, j'aime bien cette ls -d -- */option, tout comme findles directions cachées. Ce qui peut parfois être utile, mais aussi parfois causer des problèmes. J'espère que ce commentaire pourrait aider les autres. +1
mardi
12
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 revenir dans les sous-répertoires.

0x7c0
la source
5
Vous voulez probablement -maxdepth 1aussi.
Teddy
6

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 findsortie dans certains environnements, utilisez ceci:

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

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), puis j’ai fait quelque chose dans le sens de

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
le seul debianer
la source
0

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 mydir*répertoires. Notez que si vous omettez la barre oblique finale, ls -dles fichiers seront également listés:

$ 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/
Sdaau
la source
0

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

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


la source