maneira correta de iterar através do conteúdo em um diretório [duplicado]

13

Eu preciso percorrer todos os arquivos dentro de um diretório. Uma maneira comum que vi foi usar o loop for que começa com for file in *; do . No entanto, percebi que não inclui arquivos ocultos (arquivos que começam com "."). A outra maneira óbvia é fazer algo como

for file in 'ls -a'; do

No entanto, iterar sobre ls é uma má ideia, porque espaços em nomes de arquivos atrapalham tudo. Qual seria a maneira correta de percorrer um diretório e também obter todos os arquivos ocultos?

    
por stakSmashr 16.10.2014 / 22:35

1 resposta

23

Você só precisa criar uma lista de arquivos correspondentes do glob, separados por espaço:

for file in .* *; do echo "$file"; done

Editar

O acima pode reescrever de forma diferente usando a expansão de chave

 for file in {.*,*}; do echo "$file"; done

ou ainda mais curto: for file in {.,}*; do echo "$file"; done

Adicionando o caminho para os arquivos selecionados:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done

Adicionando o caminho para os arquivos selecionados:

 for file in /path/{.,}*; do echo "$file"; done

Se você deseja ser sofisticado e remover da lista, geralmente desnecessário . e .. apenas alteram {.,}* para {..?,.[!.],}* .

Para completar, é importante mencionar que também é possível definir o dotglob para corresponder aos arquivos de pontos com * puro.

shopt -s dotglob

Em zsh , é necessário definir adicionalmente nullglob para evitar o erro em caso de ausência de correspondência:

setopt nullglob

ou, como alternativa, adicione o qualificador de glob N ao padrão:

for file in /path/{.,}*(N); do echo "$file"; done
    
por 16.10.2014 / 22:41