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 ls
comando 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 $(...) do
construçã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 ... -print0
e 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 -r
garante que as barras invertidas não escapem de caracteres (de modo que, \t
por exemplo, corresponda a uma barra invertida real seguida por a t
e não por uma tabulação).