O shell está expandindo a parte >> % antes que xargs o veja.
Se você precisar fazer redirecionamentos de shell, terá que tentar algo assim:
find . -name "*.txt" -exec sh -c '
echo "hello world" >> "$0"
' {} \;
Como funciona:
-
findsubstitui{}por cada arquivo correspondente a -
bash -c "some command" arg0...conjuntos$0...dentro do script"some command"
Como alternativa, você pode usar um comando como sed que não dependa de >> , por exemplo,
find . -name "*.txt" -exec sed -i -e '$a\
hello world' {} \;
Referências: