Existe uma maneira correta de listar os subdiretórios do diretório atual?

10

Eu posso encontrar os subdiretórios de um diretório

ls -d -- */

ou

ls -l | grep "^d"

mas ambos parecem indiretos, e eu imaginaria que haveria uma maneira padrão de encontrar apenas os diretórios. Existe uma maneira certa de fazer isso? E se não, algum desses fatores levará a comportamentos indesejáveis ​​em casos extremos? (Links simbólicos, diretórios ocultos etc.)

Eric Wilson
fonte

Respostas:

17

A resposta dependerá mais do que você pretende fazer com a saída do que do que está procurando. Se você quiser apenas ver uma lista para referência visual no terminal, sua primeira solução é realmente muito boa. Se você deseja processar a saída, considere usar outro método.

Uma das maneiras mais robustas de obter uma lista para alimentar outro programa é usar find.

find -maxdepth 1 -type d

O motivo para isso é bom para feeds é que findpode gerar dados separados por nulos usando -print0ou escapar seqüências de caracteres adequadamente como argumentos para outros programas usando -exec. Para referência sobre por que isso é melhor do que analisar a saída de ls, consulte ParsingLS no Wiki de Greg.

Caleb
fonte
4
Eu tive que digitar find . -maxdepth 1 -type dpara que isso funcionasse no OS X Yosemite.
Sean Levin
11
Para listar os subdiretórios, é preciso também especificar -mindepth como em find . -maxdepth 1 -mindepth 1 -type d. Caso contrário, o diretório atual .será incluído.
tinlyx
5

FYI - Em ZSH (mas não BASH), você também pode fazer isso: ls -d -- *(/); o (/)modificador diz ao ZSH apenas para os diretórios glob.

Dito isto, não é muito diferente da sua própria solução proposta ( ls -d -- */) e está longe de ser padrão.

Quanto à saída de ls(que provavelmente difere com base em outros sinalizadores):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
Curtis F.
fonte
zsh expande o asterisco para todos os arquivos e diretórios, o sinalizador (/) seleciona partes dessa expansão para que ls * (/) também funcione, assim como echo * (/) ou uma maneira mais zshly de impressão -l * (/ ) . As duas primeiras versões também funcionam no bash.
Thor
11
Observe que se *(/)expande para os diretórios não ocultos, enquanto se */expande para diretórios não ocultos ou links simbólicos para diretórios (ou pelo menos links simbólicos para caminhos para os quais podemos dizer que são diretórios).
Stéphane Chazelas