Le tue aspettative sono basate su DOS Think/Windows Think e sono sbagliate. Su MS-DOS, Windows e in alcuni altri sistemi operativi IBM/Microsoft, l'espansione dei caratteri jolly viene eseguita dal comando stesso e cose come /a
opzione al dir
comando agiscono come filtri di attributo durante l'espansione dei caratteri jolly. dir
espande i caratteri jolly come *
, che l'interprete dei comandi gli passa così com'è e se /a
viene specificato applica gli opportuni filtri a quanto restituito. (Su alcuni sistemi operativi, gli attributi filter possono essere assegnati alla chiamata di sistema per enumerare una directory e il kernel del sistema operativo, o i suoi driver di filesystem, li applica da solo.)
Su Unix e Linux, l'espansione con caratteri jolly viene eseguita dalla shell e ignora le autorizzazioni. Quando, nella directory principale, fai
ls *
cosa il ls
comando stesso riceve dalla shell è (qualcosa come)
ls bin home opt var boot dev tmp etc lost+found root usr
Che cos'è il -d
/--directory
l'opzione fa è disattiva ciò che accade normalmente dopo . Ciò che normalmente accade dopo è ls
esamina a turno ciascuno dei suoi argomenti, vede che sono directory e decide di enumerarne il contenuto. Per gli argomenti che denominano i file, stampa solo le informazioni per il file stesso. Con il -d
opzione, le directory sono trattate proprio come i file. Quindi ls
stampa le informazioni per ciascuna delle directory passate come argomenti, proprio come farebbe se fossero file.
Quindi -d
non è un'opzione "stampa solo directory". In effetti, non solo non esiste tale opzione; non può esserci tale opzione. L'espansione con caratteri jolly viene eseguita dalla shell e (in un file POSIX sh
almeno) non c'è modo di dire alla shell di controllare i permessi e i bit del tipo di file quando espande *
in un elenco di nomi. Per ottenere un elenco dei soli nomi di directory, è necessario o utilizzare il find
comando, come spiegato da ztank1013
, o per usare il trucco che un percorso che termina con una barra implica la voce di directory .
, come spiegato da Jin
. (Jin
Il trucco di finisce con il ls
comando che riceve gli argomenti
ls bin/ home/ opt/ var/ boot/ dev/ tmp/ etc/ lost+found/ root/ usr/
perché il pattern */
in effetti corrisponde a nomi di percorso con due componenti, il secondo è vuoto, e quindi non è del tutto facendo ciò che era desiderato. In particolare, tratterà i collegamenti simbolici che puntano a directory come se fossero directory.)
Il comportamento di ls -d
senza un *
è una semplice estensione di quanto sopra. Bisogna semplicemente sapere un'altra cosa su ls
:Quando non riceve argomenti, assume come argomento predefinito .
. Ora senza il -d
opzione, il comportamento di cui sopra porta al contenuto della directory indicata da .
essere enumerato e le informazioni per il suo contenuto visualizzate. Con il -d
opzione, la directory .
viene trattato proprio come se fosse un file, e le sue informazioni vengono visualizzate, piuttosto che il suo contenuto enumerato.
Puoi usare ls -d */
o ls -d .*/
per le directory nascoste.
Prova questo
find . -mindepth 1 -maxdepth 1 -type d
per ottenere solo le directory nella tua posizione corrente.