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.