И всегда популярный
find . -name '*.java' | xargs grep -l 'string'
РЕДАКТИРОВАНИЕ (Frank Szczerba):
Если Вы имеете дело с именами файлов или каталогами, которые имеют пробелы в них, самый безопасный способ сделать, это:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
Всегда существует больше чем один способ сделать это.
Используйте grep, который лучше, чем grep, ack:
ack -l --java "string"
Это будет на самом деле использовать regex, если Вы будете хотеть, просто будете избегать метасимволов или будете выходить из них, и можно искать строки.
find . -iname "*.java" -exec egrep -il "search string" {} \;
Вы могли также использовать программу GUI как TextWrangler, чтобы сделать более интуитивный поиск, где опции находятся в интерфейсе.
Традиционный ответ UNIX был бы тем, который был принят для этого вопроса:
find . -name '*.java' | xargs grep -l 'string'
Это будет, вероятно, работать на файлы Java, но пробелы в именах файлов намного более распространены на Mac, чем в традиционном мире UNIX. Когда имена файлов с пробелами будут переданы через конвейер выше, xargs интерпретирует отдельные слова как различные имена.
То, что Вы действительно хотите, должно nul-разделить имена для создания границ однозначными:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
Альтернатива должна позволить, находят выполненный grep для Вас, как Mark предполагает, хотя тот подход медленнее при поиске больших количеств файлов (поскольку grep вызывается однажды на файл, а не однажды с целым списком файлов).