
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
É zsh
necessário definir adicionalmente nullglob
para evitar o erro em caso de não correspondência:
setopt nullglob
ou, alternativamente, adicione o qualificador glob N
ao padrão:
for file in /path/{.,}*(N); do echo "$file"; done