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
.