Risposte:
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.
ls -d -- */
e ls -d */
?
--
è convenzionalmente usato per contrassegnare la fine delle opzioni, in modo che se un file è chiamato -l
ls non lo interpreterà come l'opzione di formattazione a lungo elenco.
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)
ls -d -- */
opzione, così come find
troverò anche directory nascoste. Che a volte può essere utile, ma a volte può causare problemi. Spero che questo commento possa aiutare gli altri. +1
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 find
dell'output in alcuni ambienti, utilizzare questo:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
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
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 -d
verranno 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/
printf "%s\n" */
elencherà tutte le directory in $ PWD.
echo */
funzionerà anche, ma in una sola riga, più difficile quando i nomi hanno spazi.
Puoi anche usare:
du
O:
git ls-tree -d -r --name-only @