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.)

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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.