Esiste un modo corretto per elencare le sottodirectory della directory corrente?


10

Posso trovare le sottodirectory di una directory da

ls -d -- */

o

ls -l | grep "^d"

ma entrambi sembrano indiretti e immagino che ci sarebbe un modo standard per trovare solo le directory. C'è un modo giusto per farlo? E se no, uno di questi porterà a comportamenti indesiderati nei casi limite? (Collegamenti simbolici, directory nascoste, ecc.)

Risposte:


17

La risposta dipenderà più da ciò che si intende fare con l'output che da ciò che si sta cercando. Se vuoi solo vedere un elenco di riferimento visivo sul terminale, la tua prima soluzione è in realtà piuttosto carina. Se si desidera elaborare l'output, è consigliabile utilizzare un altro metodo.

Uno dei modi più efficaci per ottenere un elenco da inserire in un altro programma è l'utilizzo find.

find -maxdepth 1 -type d

Il motivo per cui questo è positivo per i feed è che findpuò generare i dati separati da null usando -print0o correttamente scappare stringhe come argomenti ad altri programmi usando -exec. Per riferimento sul perché questo è meglio che analizzare l'output di ls, vedere ParsingLS sul Wiki di Greg.


4
Ho dovuto digitare find . -maxdepth 1 -type dper farlo funzionare su OS X Yosemite.
Sean Levin,

1
per elencare le sottodirectory, si deve anche specificare -mindepth come in find . -maxdepth 1 -mindepth 1 -type d. In caso contrario, .verrà inclusa la directory corrente .
tinlyx,

5

CRONACA - In ZSH (ma non BASH), si può anche fare questo: ls -d -- *(/); il (/)modificatore dice a ZSH solo alle directory glob.

Detto questo, non è molto diverso dalla soluzione proposta ( ls -d -- */) ed è tutt'altro che standard.

Per quanto riguarda l'output di ls(che probabilmente differisce in base ad altri flag):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2

zsh espande l'asterisco a tutti i file e tutte le directory, il flag (/) seleziona parti dell'espansione in modo che ls * (/) funzioni, così come echo * (/) o in un modo più zshly print -l * (/ ) . Le due prime versioni funzionano anche in bash.
Thor,

1
Si noti che si *(/)espande nelle directory non nascoste mentre si */espande nelle directory non nascoste o nei collegamenti simbolici alle directory (o almeno nei collegamenti simbolici ai percorsi per i quali possiamo dire che sono directory).
Stéphane Chazelas,
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.