Il comando 'ls -d' non visualizza directory. C'è un modo per ottenere 'ls' per visualizzare solo directory invece di file e directory?


44

C'è un modo per lsvisualizzare solo le directory anziché i file e le directory?

Dalla pagina man:

   -d, --directory
          list directory entries instead of contents, and do not  derefer
          ence symbolic links

Quindi se lo scrivo nella /directory mi aspetto di vedere solo le directory. Invece mostra "."

$ cd /
$ ls -d
.

Mi aspettavo ls -ddi mostrarmi questo:

$ ls -d
bin    data  home        opt    sbin  sys      var
boot   dev   lib         media  proc  selinux  tmp
cdrom  etc   lost+found  mnt    root  srv      usr

C'è un modo per lsvisualizzare solo le directory anziché i file e le directory?


17
LSD può essere molto confuso.
Boehj,

2
@jin ls -d * / works. Ma perché devo "* /" per ottenere il risultato desiderato.
nelaaro,

8
@nelaar -dnon significa elencare solo le directory, ma non elencare i contenuti delle directory. Prova a digitare ls */e vedrai i contenuti di tutte le directory.
Jin

2
Ho ldiralised alla ls -d */mia .bashrcper rendere questo più facile ...
DQdlM

1
Ti può dare tonnellate di informazioni ma non una sola bandiera per mostrare solo le directory ...
DimiDak,

Risposte:


50

Le tue aspettative sono basate su DOS Think / Windows Think e sono sbagliate. Su MS-DOS, Windows e alcuni altri sistemi operativi IBM / Microsoft, l'espansione dei caratteri jolly viene eseguita dal comando stesso e cose come l' /aopzione al dircomando fungono da filtri di attributi durante l'espansione dei caratteri jolly. direspande i caratteri jolly come *, che l'interprete dei comandi gli passa così com'è e, se /aspecificato, applica i filtri appropriati a ciò che viene restituito. (Su alcuni sistemi operativi, i filtri degli attributi possono essere dati alla chiamata di sistema per l'enumerazione di una directory e il kernel del sistema operativo, o i suoi driver del filesystem, li applica da soli.)

Su Unices e su Linux, l'espansione dei caratteri jolly viene eseguita dalla shell ed è ignara delle autorizzazioni. Quando, nella directory principale, lo fai

ls *

ciò che il lscomando stesso riceve dalla shell è (simile)

ls bin home opt var boot dev tmp etc lost + found root usr

Ciò che fa l' opzione -d/ --directoryè disattivare ciò che accade normalmente dopo . Ciò che normalmente accade dopo è che lsguarda a turno ciascuno dei suoi argomenti, vede che sono directory e decide di enumerare i loro contenuti. Per argomenti che danno un nome ai file, stampa semplicemente le informazioni per il file stesso. Con l' -dopzione, le directory vengono trattate come file. Quindi lsstampa le informazioni per ciascuna delle directory che vengono passate come argomenti, proprio come farebbe se fossero file.

Quindi -d non è un'opzione "stampa solo directory". In realtà, non solo non esiste tale opzione; non ci può essere una tale opzione. L'espansione jolly viene eseguita dalla shell e ( shalmeno in un POSIX ) non c'è modo di dire alla shell di controllare i bit di autorizzazione e tipo di file quando si espande *in un elenco di nomi. Per ottenere un elenco dei nomi delle sole directory, è necessario utilizzare il findcomando, come spiegato da ztank1013, o usare il trucco che un percorso che termina con una barra implica la voce della directory ., come spiegato da Jin. ( JinIl trucco finisce con il lscomando che riceve gli argomenti

ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /

perché il modello */in effetti abbina i nomi dei percorsi con due componenti, il secondo è vuoto e quindi non sta facendo esattamente ciò che era desiderato. In particolare, tratterà i collegamenti simbolici che puntano alle directory come se fossero directory.)

Il comportamento di ls -dsenza a *è una semplice estensione di quanto sopra. Uno deve semplicemente sapere un'altra cosa su ls: quando non viene dato alcun argomento, assume un argomento predefinito di .. Ora senza l' -dopzione, il comportamento sopra menzionato porta al contenuto della directory nominata .dall'enumerazione e alla visualizzazione delle informazioni per il suo contenuto. Con l' -dopzione, la directory .viene trattata come se fosse un file e vengono visualizzate le sue informazioni anziché il suo contenuto elencato.


3
"non può esistere un'opzione del genere" - questa è un'affermazione piuttosto forte - l'implementazione di tale opzione è ovvia: vedere un argomento non di directory e ignorarlo. Ciò che non può essere implementato è l'equivalente di dir /s *.txt[senza ricorrere alla citazione di caratteri jolly come per trovare]
Casuale 832

6
Esatto, ma non c'è alcun motivo logico per cui non è possibile avere un'opzione che filtrerà gli elementi passati come argomenti. Il fatto che "l'espansione dei caratteri jolly è separata dal controllo del tipo di voce" è irrilevante, dal momento che ciò non ha nulla a che fare con l'espansione dei caratteri jolly, ma solo il controllo del tipo di voce, che non ha motivo per cui non possa essere eseguito interamente all'interno di ls. Se ls --color può sfumarli di blu, ls -F può mettere un / dopo di loro, e ls -l può mettere una 'd' nella modalità, quindi qualche altra ipotetica opzione potrebbe ometterli. Il fatto che tale opzione non esista non significa che " impossibile ".
Casuale 832

5
Random832 fa un punto decente: ls potrebbe avere un'opzione per filtrare file o directory e questo non si esclude a vicenda con l'espansione della shell. Non c'è alcuna condizione di competizione all'interno di ls: può filtrarlo poiché statistiche i file normalmente. (Esiste già una corsa tra l'espansione della shell e ls, FWIW.) Penso che l'espansione della shell sia solo una parte del motivo: l'espansione della shell (e il filtro in generale) non è implementata in ls perché dovrebbe essere implementata di nuovo in cp , mv, ecc. Unix è un "fai una cosa e fallo bene". Se hai bisogno di un filtro avanzato, ci sono strumenti per farlo.
Thanatos,

2
L' ls -popzione aggiunge un /simbolo solo alle directory. Non vi è alcun motivo per non estendere le capacità di stampa in uscita con qualcosa che produce solo queste (piuttosto che ls -p | grep /).
Anne van Rossum,

3
@JdeBP, gli attacchi ad-hominem ("kiddo") e l'arroganza (tutti tranne te non conoscono "i fondamenti di Unix") non fanno parte di una discussione tecnica. Inoltre, stai tirando un uomo di paglia quando affermi che un'opzione di comando non può controllare l'espansione dei caratteri jolly eseguita dalla shell. Certo che no! Né Random832, né Thanatos, né Anne van Rossum, e nemmeno la domanda stessa menziona i caratteri jolly in alcun modo. L'obiezione era che ls --only-directories .alla lsfine si poteva aggiungere un'opzione .
mkalkov,

30

È possibile utilizzare ls -d */o ls -d .*/per directory nascoste.


trucco intelligente usando il /!
Mono

Sì, va bene. C'è un caso in cui questo non funziona?
iyrin,

5
+1 per fornire la risposta in una riga. Immagino che anche la risposta accettata ce l'abbia, da qualche parte.
Calculus Knight,

Come puoi usarlo in uno script senza essere già nella directory?
DimiDak,

13

Prova questo

 find . -mindepth 1 -maxdepth 1 -type d

per ottenere solo le directory nella posizione corrente.


5

Potrebbe piacerti anche

tree -d 

che elenca ordinatamente tutte le directory e le sottodirectory con una rappresentazione grafica della struttura ad albero.


3
E per un solo livello di profondità:tree -dL 1
Anne van Rossum,

Sfortunatamente non puoi combinare molto con l'albero. # albero -d | grep wc -l (input standard)
DimiDak il

5

Se vuoi vedere le directory solo con l' ls -lopzione like like (ELL), puoi usare di seguito:

find -maxdepth 1 -type d -ls;

Sopra ti darà solo i dettagli come ottieni con l' -lopzione.


1
Potrebbe essere anche meglio usare find -maxdepth 1 -type d -exec ls -d {} +per ottenere l'output nel solito lsformato.
mkalkov,

4

Se vuoi fare il lavoro in un altro modo, prova questo:

ls -l | grep ^d

Anche se un singolo strumento è sufficiente in questa situazione. La tubatura è sempre lì per aiutarti. Mi piace la flessibilità in Linux, che vorrei che tu facessi.


1
Questo filtrerà più delle directory.
ocodo,

2
@Slomojo, questo filtrerà tutto tranne le directory. Cosa intendevi?
mkalkov,

Sì, hai bisogno di -l (long) in modo che le autorizzazioni salgano in alto. "d" per la directory. Inoltre si ottiene un elenco "lungo" di una voce della directory che è bello.
geoO

1

Spero che questo risolva le tue necessità. Il comando seguente elencherà solo le directory in un determinato percorso.

ls -F <path> | grep /

Esempio:

ls -F ~ | grep /
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.