Para passar caminhos de arquivo como argumentos para um comando, find faz isso em seu possui sua -exec opção sem nenhum truque xargs :
find /home/user -name '*.csv' -exec yourcommand '{}' +
Isso localizará todos os arquivos chamados *.csv in /home/user e, em seguida, executará yourcommand /home/user/a\ b.csv /home/user/my\ dir/c\ d\.csv ... com todos os arquivos encontrados como argumentos. Cada arquivo encontrado é passado como um argumento completo separado para o programa, portanto, não há escape ou qualquer outra coisa necessária: yourcommand obtém muitos argumentos, que são exatamente o caminho completo do arquivo.
Outra abordagem é que alguns shells ( zsh em particular ) suportam globbing mais avançado, onde você poderia apenas escreva:
yourcommand **/*.csv
e obtenha exatamente o efeito acima também.
Se você realmente quer as próprias seqüências de caracteres escapadas , ao invés de executar um comando diretamente, você pode usar bash 's built-in printf :
find /home/user -name '*.csv' -exec bash -c 'printf "%q " "$@"' dummy '{}' +
A especificação do formato %q se expande para uma versão do argumento de seqüência de caracteres com escape do shell. Com muitos argumentos, printf repete a cadeia de formatos para todos eles, portanto, isso produz sequências de escape com exceção de espaço de todos os argumentos para o comando bash -c . dummy é usado como o valor de $0 e "$@" fornece printf todos os demais argumentos, que são seus nomes de arquivo (intactos). Para o seu exemplo, isso produziria exatamente /home/user/a\ b.csv /home/user/my\ dir/c\ d\.csv .