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.
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)
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)
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
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'
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
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/
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.
Tags command-line ls linux