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 /a
opção para o dir
comando atuam como filtros de atributo durante a expansão de curinga. dir
expande curingas como *
, que o interpretador de comando passa para ele como está e, se /a
especificado, 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 ls
pró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
/ --directory
faz é desativar o que normalmente acontece a seguir . O que normalmente acontece a seguir é que ls
olha 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 -d
opção, os diretórios são tratados como arquivos. Portanto, ls
imprime 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 ( sh
pelo 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 find
comando, 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
. ( Jin
o truque termina com o ls
comando 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 -d
sem 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 -d
opçã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 -d
opçã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.