Suas expectativas são baseadas no DOS Think / Windows Think e estão erradas. No MS-DOS, Windows e, de fato, em alguns outros sistemas operacionais IBM / Microsoft, a expansão de curinga é realizada pelo próprio comando, e coisas como a /aopção para o dircomando atuam como filtros de atributo durante a expansão de curinga. direxpande curingas como *, que o interpretador de comando passa para ele como está e, se /aespecificado, aplica os filtros apropriados ao que é retornado. (Em alguns sistemas operacionais, os filtros de atributo podem ser fornecidos à chamada do sistema para enumerar um diretório e o kernel do sistema operacional, ou seus drivers do sistema de arquivos, os aplica sozinho.)
No Unices e no Linux, a expansão de curinga é feita pelo shell e não tem permissões. Quando, no diretório raiz, você faz
ls *
o que o lspróprio comando recebe do shell (algo como)
ls bin home opt var boot dev tmp etc perdido + encontrado usr raiz
O que a opção -d/ --directoryfaz é desativar o que normalmente acontece a seguir . O que normalmente acontece a seguir é que lsolha cada um de seus argumentos, vê que são diretórios e decide enumerar seu conteúdo. Para argumentos que nomeiam arquivos, apenas imprime as informações do próprio arquivo. Com a -dopção, os diretórios são tratados como arquivos. Portanto, lsimprime as informações de cada um dos diretórios que são passados como argumentos, como faria se fossem arquivos.
Portanto, -d não é uma opção "imprimir apenas diretórios". De fato, não apenas não existe essa opção; não pode haver essa opção. A expansão de curinga é feita pelo shell e ( shpelo menos em um POSIX ) não há como dizer ao shell para verificar a permissão e os bits do tipo de arquivo quando ele se expande *para uma lista de nomes. Para obter uma lista apenas dos nomes dos diretórios, é necessário usar o findcomando, conforme explicado por ztank1013, ou usar o truque que um nome de caminho que termina com uma barra implica na entrada do diretório ., conforme explicado em Jin. ( Jino truque termina com o lscomando recebendo os argumentos
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
porque o padrão */está de fato combinando nomes de caminho com dois componentes, o segundo sendo vazio e, portanto, não está fazendo exatamente o que era desejado. Em particular, ele tratará os links simbólicos que apontam para os diretórios como se fossem diretórios.)
O comportamento de ls -dsem a *é uma simples extensão do exposto acima. Simplesmente é preciso saber mais uma coisa ls: quando não é fornecido nenhum argumento, ele assume um argumento padrão de .. Agora, sem a -dopção, o comportamento mencionado acima leva ao conteúdo do diretório nomeado por .ser enumerado e as informações para seu conteúdo exibidas. Com a -dopção, o diretório .é tratado como se fosse um arquivo, e suas próprias informações são exibidas, em vez de seu conteúdo enumerado.