Традиционный ответ UNIX был бы тем, который был принят для этого вопроса:
find . -name '*.java' | xargs grep -l 'string'
Это, вероятно, будет работать для файлов Java, но пробелы в именах файлов гораздо чаще встречаются на Mac, чем в традиционном мире UNIX. Когда имена файлов с пробелами передаются через конвейер выше, xargs будет интерпретировать отдельные слова как разные имена.
Что вы действительно хотите, так это обнулить имена, чтобы сделать границы однозначными:
find . -name '*.java' -print0 | xargs -0 grep -l 'string'
Альтернатива состоит в том, чтобы позволить запустить run grep для вас, как предлагает Марк, хотя этот подход медленнее, если вы ищете большое количество файлов (поскольку grep вызывается один раз для каждого файла, а не один раз для всего списка файлов).