Elenco solo delle directory in UNIX


219

Voglio elencare solo le directory nel percorso specificato ( lsnon ha tale opzione). Inoltre, questo può essere fatto con un comando a riga singola?


12
Per il futuro: forse le basi di unix / linux tipo di domande non così difficili legate alla programmazione sono meglio qui: unix.stackexchange.com
echox

Risposte:


315

Prova questo ls -d */per elencare le directory all'interno della directory corrente


17
Ehi, è piuttosto carino, ci sono sempre abituato ls -al | grep '^d'- è molto più succinto.
paxdiablo,

43
perché usare * / ?? Spiega per favore!?
Chandeep,

6
Non ho una spiegazione corretta, tuttavia so che */forza la visualizzazione di soli elementi che terminano con una barra, che in questo caso sarebbe una directory, anche se l' -Fopzione di lsnon viene utilizzata. Simile al comportamento di ls *phpe come visualizza tutti i file che terminano con phpuna directory.
David Hancock,

3
@ user975234 Qualcuno ha fatto una domanda simile, e c'è una spiegazione abbastanza buona postata link
user1766760

17
Farebbe echo */lo stesso anche
io

95

Prova questo:

find . -maxdepth 1 -type d

8
Per me questo sembra essere il modo in cui dovrebbe essere fatto. A differenza delle lssoluzioni suggerite , findè il solo responsabile dello svolgimento del lavoro (non basandosi sull'espansione dei caratteri jolly della shell, che può imporre limiti). È anche molto più conciso.
Peter

1
La cosa negativa di questo è che non funziona se stai cercando di scorrere i risultati e i tuoi spazi hanno spazi nei nomi.
ubiquibacon,

2
In alternativa, se non si desidera includere la directory stessa: find * -maxdepth 0 -type d.
James Ko,

@ubiquibacon utilizzare uno finds' -print0o -execopzione.

1
È molto lento, almeno sul mio Mac. Sembra fare la ricerca ricorsiva completa che di findsolito fa, ma produce solo le cartelle in profondità 1.
Kara Brightwell

22

Il seguente

find * -maxdepth 0 -type d

fondamentalmente filtra l'espansione di '*', ovvero tutte le voci nella directory corrente, in base alla -type dcondizione.

Il vantaggio è che, l'output è lo stesso di ls -1 *, ma solo con le directory e le voci non iniziano con un punto


13

Puoi usare ls -d */otree -d

Un'altra soluzione sarebbe il globbing, ma questo dipende dalla shell che si sta utilizzando e se è supportato il globbing per le directory.

Ad esempio ZSH:

zsh # ls *(/)

3
Con quale sapore di Unix ottieni tree?
Johnsyweb,

tutte le principali distinzioni di Linux per esempio? scusa, non capisco la domanda?
echox,

1
Ho una distro Debian e treenon è installato di default (sebbene sia nei repository).
Stephen Schrauger,

1
Downvotes poiché credo che il treecomando non sia un comando nativo unix (per favore correggimi se sbaglio).
Tiago Cardoso,

10

Dal momento che ci sono dozzine di modi per farlo, eccone un altro:

tree -d -L 1 -i --noreport
  • -d: directory
  • -L: profondità dell'albero (quindi 1, la nostra directory di lavoro)
  • -i: nessun rientro, solo nomi di stampa
  • --noreport: non riportare informazioni alla fine della lista degli alberi

E grazie per aver spiegato gli interruttori. Stack Overflow riguarda le risposte, apprezzo sempre quando alle persone piaci solo con una spiegazione rispetto a "leggi la voce man!" <- questa non è una risposta.
fusion27

Per iniziare dalla riga 2 (salta la riga con solo un punto):tree -d -L 1 -i --noreport | tail -n +2
adius

Questa è la soluzione più alta che elenca le directory soft-link e lo fa in modo utile, esponendole come link. Preferisco la variazione:tree -C -d -L 1 -i --noreport | tail -n+2
Amnon Harel,

9
ls -l | grep '^d'

È possibile creare un alias e inserirlo nel file del profilo

alias ld="ls -l| grep '^d'"

1
i collegamenti non vengono visualizzati con questo comando. E un collegamento può essere un file o una directory. Esempio: lrwxrwxrwx 1 radice radice 21 aprile 15 17:38 cron -> / lib / init / upstart-job.
c-toesca,

7
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'

☀ trova. -maxdepth 1 -type d -name [^ \.] * | sed 's: ^ \ ./ ::' zsh: nessuna corrispondenza trovata: [^.] *
Michael Cole,

6

Per elencare è ls -d */possibile utilizzare le directory nella directory di lavoro corrente . E se hai bisogno di elencare le directory nascoste usa questo comando ls -d .*/


6

usalo per ottenere un elenco di directory

ls -d */ | sed -e "s/\///g"

ls -d <percorso- directory-custom> | sed -e "s / \ /// g" non funziona ..che indizi?
Dhwanit,

Grazie! Volevo solo l'elenco delle directory senza tutte le autorizzazioni e questo ha funzionato. :)
codingjeremy

5

find specifiedpath -type d

Se non vuoi fare ricorso in sottodirectory, puoi invece farlo:

find specifiedpath -type d -mindepth 1 -maxdepth 1

Si noti che .verranno elencate anche le directory "punto" (il cui nome inizia con ); ma non le directory speciali .... Se non vuoi directory "dot", puoi semplicemente grepdirle:

find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'


1
Voto per menzionare mindepthdi sbarazzarsi di .! 😁
adius,

5

La risposta dipenderà dalla tua shell .

Nel zsh esempio, puoi fare quanto segue:

echo *(/)

E verranno visualizzate tutte le directory all'interno della directory di lavoro corrente.

Vedere man zshexpn per maggiori informazioni.

Un approccio alternativo sarebbe quello di utilizzare find(1), che dovrebbe funzionare sulla maggior parte dei gusti Unix:

find . -maxdepth 1 -type d -print  

find(1)ha molti usi, quindi lo consiglio vivamente man find.


4

È possibile utilizzare il treecomando con la sua dopzione per eseguire ciò.

% tree -d tstdir
tstdir
|-- d1
|   `-- d11
|       `-- d111
`-- d2
    `-- d21
        `-- d211

6 directories

vedi man treeper maggiori informazioni.


Non ho votato, ho solo avuto la stessa domanda. Sembra che la tua risposta sia un imbroglione di echox, forse è per questo ?.
Louis Waweru,

1
@ Louis - grazie di cui non ho nemmeno notato la sua menzione tree. Vabbè, non avevo intenzione di rubare il tuono di nessuno.
slm,

votazione per la visualizzazione di ciò che l'albero fa
Andrejs

Credo che i downvotes siano perché è la stessa risposta di stackoverflow.com/a/3667405/523742
Tiago Cardoso,

@TiagoCardoso - il mio è precedente a quello di 2 anni.
slm,

2

Se ho questa directory:

ls -l

lrwxrwxrwx  1 nagios nagios     11 août   2 18:46 conf_nagios -> /etc/icinga
-rw-------  1 nagios nagios 724930 août  15 21:00 dead.letter
-rw-r--r--  1 nagios nagios  12312 août  23 00:13 icinga.log
-rw-r--r--  1 nagios nagios   8323 août  23 00:12 icinga.log.gz
drwxr-xr-x  2 nagios nagios   4096 août  23 16:36 tmp

Per ottenere tutte le directory, utilizzare -L per risolvere i collegamenti:

ls -lL | grep '^d'

drwxr-xr-x 5 nagios nagios   4096 août  15 21:22 conf_nagios
drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

Senza -L:

ls -l | grep '^d'

drwxr-xr-x 2 nagios nagios   4096 août  23 16:41 tmp

directory conf_nagios mancante.


2
### If you need full path of dir and list selective dir with "name" of dir(or dir_prefix*):
find $(pwd) -maxdepth 1 -type d -name "SL*"

1

Questo ha funzionato per me:

`ls -F | grep /`

(Ma sto passando a echo */come indicato da @nos)


1

Ecco un'altra soluzione che mostra le directory collegate. Lo preferisco leggermente perché è un sottoinsieme dell'output "normale" di ls -l:

ls -1d */ | rev | cut -c2- | rev | xargs ls -ld --color=always

1

In bash:

ls -d */

Elencherà tutte le directory

ls -ld */

elencherà tutte le directory in forma lunga

ls -ld */ .*/

elencherà tutte le directory, comprese quelle nascoste, in forma lunga.


Di recente sono passato a zsh (MacOS Catalina) e ho scoperto che:

ls -ld */ .*/

non funziona più se la directory corrente non contiene directory nascoste.

zsh: no matches found: .*/

Stamperà l'errore sopra riportato, ma non riuscirà nemmeno a stampare alcuna directory.

ls -ld *(/) .*(/)

Inoltre fallisce allo stesso modo.

Finora ho scoperto che questo:

ls -ld */;ls -ld .*/

è una soluzione decente. La ;è un separatore di comandi. Ma significa che se non ci sono directory nascoste, elencherà le directory e continuerà a stampare l'errore per nessuna directory nascosta:

foo
bar
zsh: no matches found: .*/

lsè il comando shell per elencare i contenuti della directory corrente
-lè il flag per specificare che si desidera elencare in Longford (un elemento per riga + un mucchio di altre informazioni interessanti)
-dè il flag per elencare tutte le directory "come file" e non ricorsivamente
*/è l'argomento "elenca tutti i file che terminano con una barra"
*è un semplice comando regex per "nulla", quindi */chiede alla shell di elencare "tutto ciò che termina in '/'"

Vediman ls per maggiori informazioni.


Ho messo questo:

alias lad="ls -ld */;ls -ld .*/"

nel mio .zshrc, e sembra funzionare benissimo.

NOTA: l'ho anche scoperto

ls -ld .*/ 2> /dev/null

non funziona, in quanto stampa ancora una volta sul terminale. Aggiornerò la mia risposta se / quando trovo una soluzione.


0

du -d1è forse l'opzione più breve. (Finché non è necessario reindirizzare l'input a un altro comando.)


0

Per elencare solo le directory in un percorso specificato, basta digitare ls -l | grep drw


Ciò potrebbe includere file, se inclusi nomi di file drw, ed escluderebbe qualsiasi directory che non sia leggibile e scrivibile dal proprietario. grep ^dfunziona meglio.
Tom Zych,

0

Elenco lungo di directory

  • ls -l | grep '^ d'
  • ls -l | grep "^ d"

Elenchi delle directory
- ls -d * /


Hai qualche buon motivo per duplicare le risposte già esistenti?
Maxim Sagaydachny,
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.