shell for loop com find com nomes de arquivos contendo espaços

shell for loop com find com nomes de arquivos contendo espaços

Considere um diretório com nomes de arquivos típicos do Microsoft Windows:

Novo Documento.txt
Foo.doc
Foo - Copiar.doc

Eu gostaria de fazer algo em cada arquivo, como:

para sendfile em $(encontre ${POLLDIR} -type f -mmin +1 -print0)
fazer
  echo \"${enviar arquivo}\"
  ls -l "${enviar arquivo}"
  e assim por diante
  se sucesso_acima
  então
    mv "${sendfile}" "${donedir}/."
  fi
feito

Observe que não quero apenas executar um comando com "${sendfile}" como argumento. Preciso que o loop faça a verificação de erros e outras coisas (como mover "${sendfile}" em caso de sucesso e registrar em caso de falha).

Qual é a construção "correta" para escapar/citar os nomes dos arquivos do find para que eu possa usá-los de maneira semelhante ao lscomando acima? Se possível, gostaria de evitar armazenar os nomes dos arquivos em um arquivo temporário, um por um.

Não acho que seja isso, find -printf '"%p"\n'conforme sugerido por triplee nos comentários à pergunta [Como uso find quando o nome do arquivo contém espaços?] funcionaria em uma for foo in $(...) doconstrução.

Acho que substituir caracteres "ilegais" ?funcionaria para mim neste caso, mas seria muito feio. O loop for finalmente processa os arquivos em ${POLLDIR} e os move quando terminar, então a chance de "Foo bar.txt" colidir com "Foo-bar.txt" é 0 (-ish).

Minha melhor tentativa até agora é:

para sendfile em $(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?')
fazer
  ...
feito

Alguma sugestão mais limpa?

Responder1

Usar find ... -print0 | while IFS="" read -d ""construção:

find "${POLLDIR}" -type f -mmin +1 -print0 | while IFS="" read -r -d "" sendfile
  do
    echo "${sendfile}"
    ls -l "${sendfile}"
    and-so-on
    if success_above
      then
        mv "${sendfile}" "${donedir}/."
    fi
done

O -d ""define o caractere de fim de linha como nulo ( \0), que é o que separa cada nome de arquivo encontrado por find ... -print0e IFS=""é necessário para trabalhar também com nomes de arquivos que contêm novas linhas - de acordo com POSIX apenas barras ( /) e nulo ( \0) são proibidos. Isso -rgarante que as barras invertidas não escapem de caracteres (de modo que, \tpor exemplo, corresponda a uma barra invertida real seguida por a te não por uma tabulação).

informação relacionada