Voglio elencare solo le directory nel percorso specificato ( ls
non ha tale opzione). Inoltre, questo può essere fatto con un comando a riga singola?
Voglio elencare solo le directory nel percorso specificato ( ls
non ha tale opzione). Inoltre, questo può essere fatto con un comando a riga singola?
Risposte:
Prova questo ls -d */
per elencare le directory all'interno della directory corrente
ls -al | grep '^d'
- è molto più succinto.
*/
forza la visualizzazione di soli elementi che terminano con una barra, che in questo caso sarebbe una directory, anche se l' -F
opzione di ls
non viene utilizzata. Simile al comportamento di ls *php
e come visualizza tutti i file che terminano con php
una directory.
echo */
lo stesso anche
Prova questo:
find . -maxdepth 1 -type d
ls
soluzioni 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.
find * -maxdepth 0 -type d
.
find
solito fa, ma produce solo le cartelle in profondità 1.
Il seguente
find * -maxdepth 0 -type d
fondamentalmente filtra l'espansione di '*', ovvero tutte le voci nella directory corrente, in base alla -type d
condizione.
Il vantaggio è che, l'output è lo stesso di ls -1 *
, ma solo con le directory e le voci non iniziano con un punto
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 *(/)
tree
?
tree
non è installato di default (sebbene sia nei repository).
tree
comando non sia un comando nativo unix (per favore correggimi se sbaglio).
Dal momento che ci sono dozzine di modi per farlo, eccone un altro:
tree -d -L 1 -i --noreport
tree -d -L 1 -i --noreport | tail -n +2
tree -C -d -L 1 -i --noreport | tail -n+2
ls -l | grep '^d'
È possibile creare un alias e inserirlo nel file del profilo
alias ld="ls -l| grep '^d'"
find . -maxdepth 1 -type d -name [^\.]\* | sed 's:^\./::'
usalo per ottenere un elenco di directory
ls -d */ | sed -e "s/\///g"
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 .
né ..
. Se non vuoi directory "dot", puoi semplicemente grep
dirle:
find specifiedpath -type d -mindepth 1 -maxdepth 1 | grep -v '^\.'
mindepth
di sbarazzarsi di .
! 😁
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
.
È possibile utilizzare il tree
comando con la sua d
opzione per eseguire ciò.
% tree -d tstdir
tstdir
|-- d1
| `-- d11
| `-- d111
`-- d2
`-- d21
`-- d211
6 directories
vedi man tree
per maggiori informazioni.
tree
. Vabbè, non avevo intenzione di rubare il tuono di nessuno.
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.
Questo ha funzionato per me:
`ls -F | grep /`
(Ma sto passando a echo */
come indicato da @nos)
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
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.
Elenco lungo di directory
Elenchi delle directory
- ls -d * /