Existe uma maneira de conseguir ls
exibir apenas diretórios em vez de arquivos e diretórios?
Na página do manual:
-d, --directory
list directory entries instead of contents, and do not derefer‐
ence symbolic links
Portanto, se eu digitar no /
diretório, espero ver apenas os diretórios. Em vez disso, mostra "."
$ cd /
$ ls -d
.
Eu esperava ls -d
me mostrar isso:
$ ls -d
bin data home opt sbin sys var
boot dev lib media proc selinux tmp
cdrom etc lost+found mnt root srv usr
Existe uma maneira de conseguir ls
exibir apenas diretórios em vez de arquivos e diretórios?
-d
não significa listar apenas diretórios, significa não listar o conteúdo do diretório. Tente digitarls */
e você verá o conteúdo de todos os diretórios.ldir
alised als -d */
no meu.bashrc
para fazer isso mais fácil ...Respostas:
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 odir
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
o que o
ls
próprio comando recebe do shell (algo como)O que a opção
-d
/--directory
faz é desativar o que normalmente acontece a seguir . O que normalmente acontece a seguir é quels
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 ofind
comando, conforme explicado porztank1013
, ou usar o truque que um nome de caminho que termina com uma barra implica na entrada do diretório.
, conforme explicado emJin
. (Jin
o truque termina com ols
comando recebendo os argumentosporque 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 coisals
: 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.fonte
dir /s *.txt
[sem recorrer a wildcards citando como para a descoberta]ls
poderia ter uma opção para filtrar arquivos ou diretórios, e isso não é mutuamente exclusivo em fazer com que o shell faça expansão. Não há condição de corrida no ls: ele pode filtrá-lo, pois classifica os arquivos normalmente. (Já existe uma corrida entre a expansão do shell e ls, FWIW.) Acho que a expansão do shell é apenas parte do motivo: a expansão do shell (e a filtragem em geral) não é implementada no ls porque precisaria ser implementada novamente no cp , mv, etc. O Unix é um "faça uma coisa e faça bem". Se você precisar de filtragem avançada, existem ferramentas para isso.ls -p
opção adiciona um/
símbolo apenas aos diretórios. Não há razão para não estender os recursos de impressão de saída com algo que apenas os produz (em vez dels -p | grep /
).ls --only-directories .
opção poderia ser adicionadals
eventualmente.Você pode usar
ls -d */
ouls -d .*/
para diretórios ocultos.fonte
Tente isto
para obter apenas diretórios em sua localização atual.
fonte
você pode gostar também
que lista todos os diretórios e subdiretórios com uma representação gráfica da estrutura da árvore.
fonte
tree -dL 1
Se você deseja ver os diretórios apenas com a opção de detalhes como
ls -l
(ELL), pode usar abaixo:Acima, você fornecerá apenas os detalhes da
-l
opção.fonte
find -maxdepth 1 -type d -exec ls -d {} +
para obter a saída nols
formato usual .Se você deseja concluir o trabalho de outra maneira, tente o seguinte:
ls -l | grep ^d
Embora uma única ferramenta seja suficiente nessa situação. A linha de tubulação está sempre lá para ajudá-lo. Eu gosto da flexibilidade no Linux, o que desejo que você faça.
fonte
Espero que isso retifique sua necessidade. O comando abaixo listará apenas diretórios em um determinado caminho.
Exemplo:
fonte