Come elencare le cartelle usando i comandi bash?


52

C'è un modo per elencare solo le cartelle in una directory usando i comandi bash? (come il lscomando elenca tutti i file e le cartelle)

Risposte:


66

Puoi usare:

ls -d -- */

Poiché tutte le directory finiscono /, questo elenca solo le directory nel percorso corrente. L' opzione -d assicura che vengano stampati solo i nomi delle directory, non il loro contenuto.


2
ls - * / elenca tutte le directory con i loro contenuti in basso
Vins

2
@ 8088 Qual è la differenza tra ls -d -- */e ls -d */?
Louis

5
@Louis, --è convenzionalmente usato per contrassegnare la fine delle opzioni, in modo che se un file è chiamato -lls non lo interpreterà come l'opzione di formattazione a lungo elenco.
Cristian Ciupitu,

29

La risposta di Stephen Martin ha dato un avvertimento ed elencato anche la cartella corrente, quindi suggerirei

find . -mindepth 1 -maxdepth 1 -type d

(Questo è su Linux; non sono riuscito a trovare -maxdepth e -mindepth nella pagina man POSIX per trovare)


1
Domanda precedente che conosco. Anche se inizialmente vorrei rivolgermi per trovare questo compito, mi piace l' ls -d -- */opzione, così come findtroverò anche directory nascoste. Che a volte può essere utile, ma a volte può causare problemi. Spero che questo commento possa aiutare gli altri. +1
matchew

12
find . -maxdepth 1 -type d

Elencherà solo le cartelle. E come ha sottolineato Teddy, avrai bisogno di -maxdepth per impedirgli di ricadere in sottodirectory


5
Probabilmente lo vorrai -maxdepth 1anche tu .
Teddy

6

La risposta di Daniel è corretta. Ecco alcune utili aggiunte, però.

Per evitare di elencare cartelle nascoste (come .git), prova questo:

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

E per sostituire la temuta barra dei punti all'inizio finddell'output in alcuni ambienti, utilizzare questo:

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

1

Non devi "analizzare" l'output di ls, o almeno così si dice. Il ragionamento alla base è che l'output è destinato a essere leggibile dall'uomo e che può renderlo inutilmente complicato da analizzare, se ricordo.

se non vuoi ls o find, potresti provare a filtrare "*" con "[-d]".

Ho fatto proprio questo, per qualche motivo e trovo che non funzionasse (i nomi dei file con spazi e parentesi credo, o qualcos'altro che stavo trascurando), quindi ho fatto qualcosa sulla falsariga di

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

0

Solo per sottolineare una cosa che mi ha confuso qui, rispetto alla selezione dei modelli glob; dire che hai questo:

$ 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

Quindi, dì qui che vuoi selezionare solo le mydir*directory. Si noti che se si esclude la barra di chiusura, ls -dverranno elencati anche i file:

$ 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

... tuttavia, con una barra che termina, vengono elencate solo le directory:

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

0

printf "%s\n" */ elencherà tutte le directory in $ PWD.

echo */ funzionerà anche, ma in una sola riga, più difficile quando i nomi hanno spazi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.