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

Esta pergunta já tem respostas aqui :

Resposta

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

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

Editar

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

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

ou ainda menor : 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 selecionados arquivos:

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

Se você quiser ser sofisticado e remover da lista, geralmente desnecessário . e

basta alterar {.,}* para {..?,.[!.],}*.

Para completar, vale a pena para mencionar que também se pode definir dotglob para combinar arquivos de ponto com * puro.

shopt -s dotglob 

Em 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 

Comentários

  • Muito obrigado! Portanto, se eu quiser iterar por qualquer diretório, apenas coloco o nome do diretório antes de cada um dos itens, certo? como for file in dir/.* dir/*; do
  • ' não é tão fácil. .* corresponde a . e .. (exceto em zsh). * permanece * se não houver nenhum arquivo correspondente. shopt -s gotglob está apenas no bash.
  • Estou recebendo zsh: no matches found: .* quando executo o (s) comando (s) nesta resposta . Por que isso aconteceria? ls no diretório mostra os arquivos.
  • @Niyaz que ' s porque zsh retorna erro se algum padrão não partidas. Para evitar a execução setopt nullglob, que desativará esse recurso globalmente, ou adicionará o qualificador (N) após a estrela global, ou seja: for file in /path/{.,}*(N); do echo "$file"; done.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *