C'è qualche opzione con il comando 'ls' che vedo solo le directory?


74

A volte, devo controllare solo le directory e non i file. C'è qualche opzione con il comando ls? O c'è qualche utilità per farlo?

EDIT : sto usando Mac OS X e ls -dmi dà .anche se ho directory.


4
Qualcuno può spiegare perché ls -ddà solo .e perché */deve essere aggiunto alla fine per farlo funzionare?
Cwd

3
@cwd Se non si specifica alcun file, l' lsimpostazione predefinita è .. E -dsignifica non stampare il contenuto della directory, stampare la directory stessa.
Mikel,

1
@cwd prova ad usarlo ls -pmostra /dopo i nomi delle directory. Quindi */è solo un modello che viene confrontato con il nome della directory e la /combo.
Pitt,

Ho creato una funzione implementando la risposta di @ Steven_D per il mio file ~ / .bash_aliases: gist.github.com/rjurney/998f4951a57bfa5daeb9a6c18f6f4827
rjurney

Risposte:


84

So che esiste già una risposta selezionata, ma puoi ottenere il comportamento richiesto solo con ls:

ls -ld -- */

(Notare che '-' segna la fine dei parametri, impedendo che i nomi delle cartelle che iniziano con un trattino vengano interpretati come ulteriori opzioni di comando.)

Questo elencherà tutte le directory non nascoste (a meno che non si configurino i globs della shell per espanderle) nella directory di lavoro corrente in cui viene eseguita (si noti che include anche collegamenti simbolici alle directory). Per ottenere tutte le sottodirectory di qualche altra cartella, basta provare:

ls -ld /path/to/directory/*/

Si noti che -l è facoltativo.


5
Bello. Non ho mai considerato che le directory abbiano un implicito /alla fine, ma ora che ti vedo rispondere ha senso. Dopotutto, il completamento con tabulazione lo aggiunge sempre.
gvkv,

-d for dir, -l for long format. qual è lo scopo di --?
Dineshkumar,

1
Anche se questo sembra breve e funziona nella maggior parte dei casi, è possibile che non si desideri utilizzare questo approccio quando è necessaria una directory reale, non il collegamento simbolico di una directory. Quindi in findrealtà è una buona scelta in quel caso.
biocyberman,

1
findha anche il vantaggio quando il numero di directory supera la lunghezza massima dell'argomento.
Steven D,

Andando a ritroso, ho appena realizzato si può semplicemente ignorare qualsiasi cosa con un interno: ls -alhF --ignore=*.*. Non sono sicuro di come gestirà le cartelle "nascoste", ovvero.myHiddenFolder
Timmah

14

No, ma un semplice findcomando lo farà:

find . -type d -depth 1

o grep

ls -F | grep /

È quindi possibile alias uno dei due se necessario.


6
Su Ubuntu 14.04 lo era -maxdepth 1. findVolevo anche che io find . -maxdepth 1 -type d
ribaltassi

Quella ls -F | grep /soluzione fa miracoli! Sembra essere l'unico che riesco a far funzionare sulla mia macchina FreeBSD. Penso che usare Fish significhi che qualcosa con */potrebbe non funzionare?
cjm

Non ho mai lavorato con Fish, quindi non ne sono sicuro, ma l'opzione -F può fare miracoli.
gvkv,

7

Mi piace l' utilità dell'albero per avere una visione d'insieme della struttura delle directory. È disponibile in MacPorts e in tutte le distribuzioni Linux che ho provato.

tree -d -L 2

Ciò mostrerebbe tutte le directory, a due livelli di profondità.


6

Avevo anche bisogno di visualizzare le directory nascoste, quindi ho modificato il suggerimento sopra per soddisfare le mie esigenze

ls -d -- */ .*/

(a seconda della shell, che può anche includere .e ..)


2

Con zsh(come si trova di default su macOS, era anche /bin/shlì), avresti usato i qualificatori glob per selezionare i file in base al loro tipo:

  • Elenca le directory non nascoste:

    ls -d -- *(/)
    
  • Elenca tutte le directory:

    ls -d -- *(D/)
    

    ( .e ..sono sempre esclusi, aggiungili singolarmente se li desideri)

  • Includi anche collegamenti simbolici alle directory:

    ls -d -- *(D-/)
    

    ( -rende quindi applicabili ulteriori qualificazioni dopo la risoluzione del collegamento simbolico).


-1

Penso che abbia un bug su Mac OS X. Una soluzione alternativa è usare grep ... ls -l / | grep "^d"


1
È bello sapere che non sono la sola persona che usa l' grep "^d"hack
Michael Mrozek

6
Per quanto ne so, il comportamento che descrive non è un bug ed è lo stesso se si utilizza GNU ls. L'opzione -d visualizza l'elenco per la directory e non i contenuti. Per capire perché questo può essere utile vedi la differenza tra: ls -l /homeels -dl /home
Steven D

I carati non sono speciali per il guscio. Puoi semplicemente usare ls -l / | grep ^d. Se si ha intenzione di usare le virgolette, dal momento che non è necessario l'espansione di parametro, li rendono singoli apici. ls -l / | grep '^d'. Sì, sono un pedante. Ma davvero, fallo. :)
Wildcard

-1
$ ls -p | grep /

Il -pflag farà lsaggiungere una barra (`/ ') dopo ogni nome file se quel file è una directory.


-2

Il modo più semplice è digitare il seguente comando. Funziona con la maggior parte delle piattaforme e versioni UNIX e Linux. Se lo -Fsi desidera, è possibile saltare , ma è l'argomento che aggiunge / alla fine del nome della directory. L' -Cargomento acquisisce solo i nomi di directory, tutti nella directory corrente. Se vuoi vedere solo le directory e le sottodirectory nel percorso corrente, aggiungi semplicemente l' -Rargomento ( ls -CFR).

# ls -CF
/dir1  /dir2  /dir3  /beaches  /Work  /Other 

1
In tutte le lsimplementazioni che conosco e nella specifica POSIX di ls, -Cè l'output in colonne , non saltare i file non di directory. Nel tuo esempio, /vengono stampati prima dei nomi dei file, cosa che nessuna lsimplementazione farebbe. Con -F, /viene aggiunto il nome del file per i file di directory.
Stéphane Chazelas,

Quando ho visto questa risposta, mi chiedevo "Dov'è questo vero?"
G-Man,

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.