O comando 'ls -d' não está exibindo diretórios. Existe uma maneira de obter 'ls' para exibir apenas diretórios em vez de arquivos e diretórios?

43

Existe uma maneira de obter ls para exibir somente diretórios em vez de arquivos e diretórios?

Da página do manual:

   -d, --directory
          list directory entries instead of contents, and do not  derefer‐
          ence symbolic links

Portanto, se eu digitá-lo no diretório / , espero ver somente diretórios. Em vez disso, mostra "."

$ cd /
$ ls -d
.

Esperei que ls -d me mostrasse isto:

$ 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 obter ls para exibir somente diretórios em vez de arquivos e diretórios?

    
por nelaaro 10.10.2011 / 10:44

7 respostas

48

Suas expectativas são baseadas no DOS Think / Windows Think e estão erradas. No MS-DOS, Windows e, na verdade, em alguns outros sistemas operacionais IBM / Microsoft, a expansão de curingas é feita pelo próprio comando, e coisas como a opção /a para o comando dir atuam como filtros de atributo durante a expansão de curingas. dir expande curingas como * , que o interpretador de comandos passa para ele como está e, se /a for 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 de sistema de arquivos, os aplica por conta própria.)

No Unices e no Linux, a expansão de curingas é feita pelo shell e não reconhece as permissões. Quando, no diretório raiz, você faz

ls *

o que o comando ls em si recebe do shell é (algo como)

ls bin home opt var boot dev tmp etc lost+found root usr

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 dos seus argumentos, vê que são diretórios e decide enumerar seu conteúdo. Para argumentos que nomeiam arquivos, ele apenas imprime as informações para o próprio arquivo. Com a opção -d , 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 seus argumentos, da mesma forma que faria se fossem arquivos.

Portanto, -d não é uma opção "somente diretórios de impressão". De fato, não existe apenas tal opção; lá não pode ser tal opção. A expansão de curingas é feita pelo shell e (em um POSIX sh pelo menos) não é possível dizer ao shell para verificar a permissão e os bits do tipo de arquivo quando ele expande * em uma lista de nomes. Para obter uma lista apenas dos nomes de diretórios, é necessário usar o comando find , conforme explicado por ztank1013 , ou usar o truque que um nome de caminho que termina com uma barra implica na entrada de diretório . , como explicado por Jin . (O truque de Jin termina com o comando ls 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á bastante fazendo o que foi desejado. Em particular, ele tratará links simbólicos apontando para diretórios como se fossem diretórios.)

O comportamento de ls -d sem * é uma simples extensão do acima. Basta saber mais uma coisa sobre ls : quando não é dado nenhum argumento, ele assume um argumento padrão de . . Agora sem a opção -d , o comportamento mencionado leva ao conteúdo do diretório nomeado por . sendo enumerado e as informações de seu conteúdo exibidas. Com a opção -d , o diretório . é tratado como se fosse um arquivo, e suas próprias informações são exibidas, ao invés de seu conteúdo ser enumerado.

    
por 10.10.2011 / 11:51
29

Você pode usar ls -d */ ou ls -d .*/ para diretórios ocultos.

    
por 10.10.2011 / 10:55
13

Tente isso

 find . -mindepth 1 -maxdepth 1 -type d

para obter apenas diretórios em sua localização atual.

    
por 10.10.2011 / 10:54
5

Se você quiser ver apenas os diretórios com detalhes como ls -l (ELL), você pode usar abaixo:

find -maxdepth 1 -type d -ls;

Acima, você só receberá os detalhes com a opção -l .

    
por 19.03.2013 / 23:28
4

Você também pode gostar

tree -d 

que lista todos os diretórios e subdiretórios com uma representação gráfica da estrutura da árvore.

    
por 15.11.2012 / 10:06
4

Se você deseja realizar o trabalho de outra maneira, tente o seguinte:

ls -l | grep ^d

Embora uma única ferramenta seja suficiente nessa situação. A linha de tubos está sempre pronta para ajudá-lo. Eu gosto da flexibilidade no Linux, o que eu desejo que você faça.

    
por 01.06.2013 / 04:27
1

Espero que isso corrija sua necessidade. O comando abaixo listará apenas os diretórios em um determinado caminho.

ls -F <path> | grep /

Exemplo:

ls -F ~ | grep /
    
por 27.11.2013 / 08:23

Tags