Это происходит потому, что одно из имен файлов содержит кавычки и передается в xargs
как есть. Это означает , что xargs
управляют как xargs grep 'addresses' > /tmp/addr some file'name
- и есть незавершенная '
Проблема в том, что вы используете find | xargs
Это то, что вы действительно не хотите делать, даже если это выглядит заманчиво.
Есть несколько решений этой проблемы:
Используйте параметр -print0
для find
и -0
для xargs
:
find src/main/webapp/WEB-INF/ -name "*" -print0 | xargs -0 grep 'addresses' > /tmp/addr
Это рекомендуемый способ передачи из find
в xargs
поскольку он может работать с любым именем файла, даже с теми, которые содержат переводы строк.
Обратите внимание, что использование -name "*"
является излишним. Вам также следует рассмотреть возможность использования -type f
для фильтрации только файлов. И, конечно, вы также можете вызвать программу из find
:
find … -type f -exec grep 'addresses' {} \; > /tmp/addr
Но это тоже не рекомендуется. Смотрите второй вариант:
В целом используйте более эффективный подход - рекурсивный grep
с опцией -r
:
grep -r 'addresses' src/main/webapp/WEB-INF/ > /tmp/addr