Você está procurando "howdy doody" no nome do arquivo ou no arquivo?
# find files with "howdy doody" in the filename
find * -name "*howdy doody*" -print0 | xargs -0 ...
xargs
é o que você precisa usar para dividir a saída com terminação nula de find -print0
. No seu exemplo, o echo
é estranho; não se incomode com isso.
# find files containing "howdy doody"
find * -print0 | xargs -0 grep -l "howdy doody"
# find files containing "howdy doody" and do further processing
# multiple xargs version
find * -print0 | xargs -0 grep -l "howdy doody" | xargs -i{} do-something "{}"
# "sh -c" version
find * -print0 | xargs -0 -i{} sh -c 'grep -l "howdy doody" "{}" && do-something "{}"'
# notes:
# "sh -c" allows us to run a complex command with a single xargs
# "{}" handles spaces-in-filename
# handles any &&, ||, | command linking
Você também pode executar seu comando diretamente do find
with -exec
. A diferença é que find -exec
executa o comando uma vez por arquivo encontrado; xargs
adiciona nomes de arquivos ao final do comando (até o limite do sistema), portanto, ele executa o comando menos vezes. Você pode simular isso com xargs -n1
para forçar xargs
a executar apenas um comando por entrada.
# grep once per file
find * -exec grep -l "howdy doody" {} \; | ...