Respostas:
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.
ls -d -- */
e ls -d */
?
--
é convencionalmente usado para marcar o final das opções, de modo que, se um arquivo for nomeado, -l
ls não o interpretará como a opção de formato de listagem longa.
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)
ls -d -- */
opção, pois find
també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
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 find
saída em alguns ambientes, use o seguinte:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
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
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 -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 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/
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.
Você também pode usar:
du
Ou:
git ls-tree -d -r --name-only @