Como listar pastas usando comandos bash?

50

Existe alguma maneira de listar apenas as pastas em um diretório usando comandos bash? (como o comando ls lista todos os arquivos e pastas)

    
por SpiXel 14.09.2011 / 10:27

7 respostas

63

Você pode usar:

ls -d -- */

Como todos os diretórios terminam em / , isso lista apenas os diretórios no caminho atual. A opção -d garante que apenas os nomes dos diretórios sejam impressos, não seus conteúdos.

    
por 14.09.2011 / 10:35
25

A resposta de Stephen Martin deu um aviso, e listou a pasta atual também, então eu sugiro

find . -mindepth 1 -maxdepth 1 -type d

(Isso é no Linux; não consegui encontrar -maxdepth e -mindepth na página man do POSIX para encontrar)

    
por 14.09.2011 / 11:09
12
find . -maxdepth 1 -type d

Listará apenas as pastas. E como Teddy apontou, você precisará de -maxdepth para impedi-lo de se converter em sub dirs

    
por 14.09.2011 / 10:33
5

A resposta de Daniel está correta. Aqui estão algumas adições úteis.

Para evitar listar pastas ocultas (como .git ), tente isto:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

E para substituir a temida barra de pontos no começo de find output em alguns ambientes, use isto:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'
    
por 09.05.2013 / 09:53
1

Você "não deveria" analisar a saída de ls, ou assim é dito. O raciocínio por trás disso é que a saída se destina a ser legível e que pode tornar desnecessariamente complicada a análise, se bem me lembro.

se você não quer ls ou encontrar, você pode tentar filtrar "*" com "[-d]".

Eu fiz exatamente isso, por algum motivo eu e o Find não estavam funcionando (nomes de arquivos com espaços e colchetes eu acho, ou algo mais que eu estava esquecendo), então eu fiz algo nos moldes de

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
    
por 31.05.2014 / 02:32
0

Só para enfatizar uma coisa que me confundiu aqui, no que diz respeito à seleção de padrões globais; digamos que você tenha isso:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

Então, digamos que você queira selecionar apenas os diretórios mydir* . Observe que, se você deixar a barra de finalização, ls -d listará os arquivos também:

$ ls -d testglob/mydir*   # also 'ls -d -- testglob/mydir*'
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... no entanto, com uma barra de finalização, apenas os diretórios são listados:

$ ls -d testglob/mydir*/   # also 'ls -d -- testglob/mydir*/'
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/
    
por 12.09.2013 / 12:58
0

printf "%s\n" */ listará todos os diretórios no $ PWD.

echo */ também funcionará, mas em uma longa linha, mais difícil quando os nomes tiverem espaços.

    
por 24.07.2015 / 08:26