Se você quiser usar find output em xargs , a maneira recomendada é canalizá-lo usando NUL caracteres para delimitar cada nome de arquivo:
find src/main -name "*" -print0 | xargs -0 grep -i 'mystring'
A razão para isso é que o shell (e xargs especificamente) geralmente divide argumentos (ou insira no caso de xargs ) com base no espaço em branco, ou seja, espaços, tabulações e novas linhas. Depois de usar -0 , xargs lerá cada campo separado por NUL , que é o que find -print0 produz.
Isso funcionará no GNU find e xargs , bem como nas versões incluídas no OS X. Outras versões podem não ter as opções, pois elas não são necessárias no POSIX.
Mas, novamente, isso não é realmente necessário. O padrão de nome "*" se expande para todos os nomes possíveis. grep pode reciclar sozinho, então tudo que é necessário é:
grep -ri 'mystring' src/main
No Bash 4 (não fornecido com o OS X por padrão), você também pode fazer globalização recursiva, por exemplo sobre todos os arquivos .txt , usando a opção globstar :
shopt -s globstar
grep -i 'mystring' **/*.txt