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.