Isso acontece porque um dos nomes de arquivo contém uma cotação e é passado para xargs
como está. Isso significa que xargs
é executado como xargs grep 'addresses' > /tmp/addr some file'name
- e há um '
não finalizado aqui.
O problema real é que você está usando find | xargs
. Isso é algo que você realmente não quer fazer, mesmo que pareça tentador.
Existem algumas soluções para este problema:
-
Use a opção
-print0
parafind
e-0
paraxargs
:find src/main/webapp/WEB-INF/ -name "*" -print0 | xargs -0 grep 'addresses' > /tmp/addr
Esta é a maneira recomendada de canalizar de
find
paraxargs
porque ele pode lidar com qualquer nome de arquivo, mesmo aqueles que contenham novas linhas.Observe que usar
-name "*"
é supérfluo. Você também deve considerar usar-type f
para filtrar apenas arquivos. E você poderia, claro, chamar um programa de dentro defind
, também:find … -type f -exec grep 'addresses' {} \; > /tmp/addr
Mas isso também não é recomendado. Veja a segunda opção:
-
Use uma abordagem mais eficiente - recursiva
grep
ing com a opção-r
:grep -r 'addresses' src/main/webapp/WEB-INF/ > /tmp/addr