Como listar pastas usando comandos bash?

52

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

SpiXel
fonte

Respostas:

66

Você pode usar:

ls -d -- */

Como todos os diretórios terminam /, 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 seu conteúdo.

Gaff
fonte
2
ls - * / lista todos os diretórios com o conteúdo abaixo
Vins
2
@ 8088 Qual é a diferença entre ls -d -- */e ls -d */?
Louis
5
@ Louis, --é convencionalmente usado para marcar o final das opções, de modo que, se um arquivo for nomeado, -lls não o interpretará como a opção de formato de listagem longa.
Cristian Ciupitu
29

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 foi possível encontrar -maxdepth e -mindepth na página do manual POSIX para localizar)

daniel kullmann
fonte
11
Pergunta mais antiga que eu conheço. Embora eu também tenha procurado inicialmente essa tarefa, gosto da ls -d -- */opção, pois findtambém encontrará diretórios ocultos. O que às vezes pode ser útil, mas também às vezes causa problemas. Espero que este comentário possa ajudar outras pessoas. 1
matchew
12
find . -maxdepth 1 -type d

Irá listar apenas pastas. E como Teddy apontou, você precisará de -maxdepth para impedir que se recuse em subdiretórios

0x7c0
fonte
5
Você provavelmente -maxdepth 1também quer .
Teddy
6

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

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

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

E para substituir a barra de pontos temida no início da findsaída em alguns ambientes, use o seguinte:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'
Mathias Bynens
fonte
1

Você "não deveria" analisar a saída de ls, ou é o que se diz. O raciocínio subjacente é que a saída se destina a ser legível por humanos e que pode tornar desnecessariamente complicado analisar, se bem me lembro.

se você não quiser ls ou find, tente filtrar "*" com "[-d]".

Fiz exatamente isso, por algum motivo, ls e o achado não estavam funcionando (acho que nomes de arquivos com espaços e colchetes ou qualquer outra coisa que eu estava ignorando), então fiz algo ao longo das linhas de

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
o debianer solitário
fonte
0

Apenas para enfatizar uma coisa que me confundiu aqui, no que diz respeito à seleção de padrões globais; diga que você tem 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, diga aqui que você deseja selecionar apenas mydir*diretórios. Observe que, se você deixar de fora a barra final, ls -dlistará 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 final, 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/
sdaau
fonte
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.


fonte