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' /a
opzione al dir
comando fungono da filtri di attributi durante l'espansione dei caratteri jolly. dir
espande i caratteri jolly come *
, che l'interprete dei comandi gli passa così com'è e, se /a
specificato, 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 ls
comando 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 ls
guarda 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' -d
opzione, le directory vengono trattate come file. Quindi ls
stampa 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 ( sh
almeno 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 find
comando, 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
. ( Jin
Il trucco finisce con il ls
comando 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 -d
senza 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' -d
opzione, il comportamento sopra menzionato porta al contenuto della directory nominata .
dall'enumerazione e alla visualizzazione delle informazioni per il suo contenuto. Con l' -d
opzione, la directory .
viene trattata come se fosse un file e vengono visualizzate le sue informazioni anziché il suo contenuto elencato.