Usar for
com find
é a abordagem errada aqui, veja por exemplo this writeup sobre a lata de worms que você está abrindo.
A abordagem recomendada é usar find
, while
e read
conforme descrito aqui . Abaixo está um exemplo que deve funcionar para você:
find . -type f -name '*.*' -print0 |
while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done
Desta forma, você delimita os nomes dos arquivos com caracteres nulos (
), o que significa que a variação no espaço e outros caracteres especiais não causam problemas. find
Para atualizar um arquivo com os arquivos que tar
localiza, você pode passar a saída diretamente para tar
:
find . -type f -name '*.*' -printf '%pfind . -type f -name '*.*' -print0 |
while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done
' |
tar --null -uf archive.tar -T -
Note que você não precisa diferenciar se o arquivo existe ou não, -printf
irá lidar com isso de maneira sensata. Observe também o uso de ./
aqui para evitar incluir o %code% no arquivo.