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.