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

1

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

New Document.txt
Foo.doc
Foo - Copy.doc

Gostaria de fazer algo em cada arquivo, como:

for sendfile in $(find ${POLLDIR} -type f -mmin +1 -print0)
do
  echo \"${sendfile}\"
  ls -l "${sendfile}"
  and-so-on
  if success_above
  then
    mv "${sendfile}" "${donedir}/."
  fi
done

Por favor, note que eu não quero apenas executar um comando com "$ {sendfile}" como argumento. Eu preciso do loop para fazer a verificação de erros e outras coisas (como mover "$ {sendfile}" no sucesso e registrar falha).

O que é um constructo "correto" para escapar / citar os nomes dos arquivos de find para que eu possa usá-los de forma parecida com o comando ls acima? Se possível, gostaria de evitar armazenar os nomes de arquivos em um arquivo temporário, um por um.

Eu não acho que find -printf '"%p"\n' como sugerido por triplee nos comentários para questionar [ Como eu uso quando o nome do arquivo contém espaços? ] funcionaria em uma construção for foo in $(...) do .

Acho que substituir os caracteres "ilegais" por ? funcionaria para mim neste caso, mas seria muito feio. O loop for, por fim, processa arquivos em $ {POLLDIR} e, em seguida, os move quando concluído, portanto, a chance de "Foo bar.txt" colidir com "Foo-bar.txt" é 0 (-ish).

Minha melhor tentativa até agora é:

for sendfile in $(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?')
do
  ...
done

Alguma sugestão de limpeza?

    
por MattBianco 09.10.2014 / 16:38

1 resposta

5

Use find ... -print0 | while IFS= read -d '' construct:

find ${POLLDIR} -type f -mmin +1 -print0 | while IFS= read -r -d '' -r 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 find -print0 , que separa cada arquivo encontrado por IFS= e o -r também é necessário para trabalhar com arquivos que contenham novas linhas. O \t garante que as barras invertidas não escapem de caracteres (para que t , por exemplo, corresponda a uma barra invertida real seguida de %code% e não de uma tabulação).

    
por 09.10.2014 / 16:47