12

Как мне найти во всех файлах .java простую строку (не регулярное выражение) в текущем каталоге и во всех подкаталогах в Mac OS X? Я просто хочу напечатать список имен файлов и каталогов, которые совпадают.

9 ответов9

19

И всегда популярный

find . -name '*.java' | xargs grep -l 'string'

РЕДАКТИРОВАТЬ (Фрэнк Щерба):

Если вы имеете дело с именами файлов или каталогов, в которых есть пробелы, самый безопасный способ сделать это:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Всегда есть несколько способов сделать это.

11

Традиционный ответ UNIX был бы тем, который был принят для этого вопроса:

find . -name '*.java' | xargs grep -l 'string'

Это, вероятно, будет работать для файлов Java, но пробелы в именах файлов гораздо чаще встречаются на Mac, чем в традиционном мире UNIX. Когда имена файлов с пробелами передаются через конвейер выше, xargs будет интерпретировать отдельные слова как разные имена.

Что вы действительно хотите, так это обнулить имена, чтобы сделать границы однозначными:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Альтернатива состоит в том, чтобы позволить запустить run grep для вас, как предлагает Марк, хотя этот подход медленнее, если вы ищете большое количество файлов (поскольку grep вызывается один раз для файла, а не один раз для всего списка файлов).

6

Используйте grep, который лучше, чем grep, ack:

ack -l --java  "string" 
4

Это на самом деле будет использовать регулярное выражение, если вы хотите, просто держитесь подальше от метасимволов или избегайте их, и вы можете искать строки.

find . -iname "*.java" -exec egrep -il "search string" {} \;
3
grep -rl --include="*.java" simplestring *
1

Поскольку это вопрос OSX, вот более конкретный ответ для OSX.

Пропустите find и используйте Spotlight из командной строки. Гораздо мощнее!

КОМАНДА LINE SPOTLIGHT - НАЙТИ ВСТРЕЧАЕТСЯ С GREP

Большинство людей не знают, что вы можете выполнять поиск Spotlight из командной строки. Зачем запоминать все тайные варианты поиска и поиска, а что нет, когда вы можете позволить Spotlight сделать всю работу за вас. Интерфейс командной строки для Spotlight называется mdfind. Он обладает той же мощью, что и поиск Spotlight в GUI, и даже больше, потому что его можно создавать в командной строке!

0
grep "(your string)" -rl $(find ./ -name "*.java")

Если вы хотите игнорировать регистр, замените -rl на -irl. (ваша строка) также может быть регулярным выражением, если вы когда-нибудь увидите необходимость.

0

Дайте этому попробовать:

grep -rl "string" */*java
-1

Вы также можете использовать программу с графическим интерфейсом, такую как TextWrangler, для более интуитивного поиска, где параметры находятся в интерфейсе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .