maneira correta de iterar o conteúdo de um diretório

maneira correta de iterar o conteúdo de um diretório

Preciso iterar 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 ele 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 lsé uma má ideia porque os espaços nos nomes dos arquivos bagunçam tudo. Qual seria a maneira correta de percorrer um diretório e também obter todos os arquivos ocultos?

Responder1

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

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

Editar

O acima pode ser reescrito de forma diferente usando expansão de chaves

 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 caminho para arquivos selecionados:

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

Se você quer ser sofisticado e retirar da lista o que normalmente é desnecessário .e ..basta mudar {.,}*para {..?,.[!.],}*.

Para completar, vale a pena mencionar que também é possível configurar dotglob para combinar arquivos de ponto com pure *.

shopt -s dotglob

É zshnecessário definir adicionalmente nullglobpara evitar o erro em caso de não correspondência:

setopt nullglob

ou, alternativamente, adicione o qualificador glob Nao padrão:

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

informação relacionada