grep все файлы .java в каталоге для конкретной строки

13523
John Topley

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

12
Спасибо, что спросили, так что мне не нужно. Теперь мне просто нужно выяснить, как исключить «.git», и я немного покончил. Dan Rosenstark 13 лет назад 0
I think js's answer is more concise, still sucks you have to type out --include, but still. Could probably just write an alias to hide that Craig Tataryn 13 лет назад 0

9 ответов на вопрос

18
David Mackintosh

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

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

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

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

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

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

`mdfind` [это более OSXy способ сделать это] (http://www.vertigrated.com/blog/2010/03/command-line-spotlight-find-meets-grep/)! Jarrod Roberson 13 лет назад 0
11
Frank Szczerba

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

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

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

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

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

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

Вы также можете использовать опцию «--replace» в xargs для работы с именами файлов, в которых есть пробелы: ... | xargs --replace grep 'string' '{}' ({} будет заменено именем файла) arathorn 15 лет назад 0
Современные версии find (включая установленную на OS X) поддерживают "-exec" {} + "где знак плюс в конце (вместо \;) указывает найти для замены {} на" как можно больше имен путей ... Это похоже на xargs (1) "(со страницы руководства ). Doug Harris 15 лет назад 1
6
bortzmeyer

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

ack -l --java "string" 
ack не устанавливается в Mac OS X по умолчанию. John Topley 15 лет назад 3
Я не знаю, что означает «по умолчанию». На многих ОС вы выбираете то, что устанавливаете, поэтому сложно найти программы, которые всегда присутствуют. В то время компилятор C всегда был там, и Perl был необычным ... bortzmeyer 15 лет назад 0
Это означает, что это часть стандартной установки ОС. У меня установлены инструменты разработчика на моем Mac, и они не устанавливаются. Вы должны установить его самостоятельно. Если у вас есть, то это хороший синтаксис. John Topley 15 лет назад 1
В случае ack это одна Perl-программа без зависимостей от модулей. Если вы можете «установить» программы в вашем каталоге ~ / bin, то вы можете так же легко «установить» ack. Andy Lester 14 лет назад 0
4
Mark Thalman

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

find . -iname "*.java" -exec egrep -il "search string" {} \;

3
js.
grep -rl --include="*.java" simplestring * 
Это, кажется, лучший ответ здесь - если grep делает все это, зачем использовать find & xargs? Peter Gibson 14 лет назад 1
К вашему сведению, учитывая то, что задано в вопросе, в этой команде должно быть маленькое «l», а не большое «L» Craig Tataryn 13 лет назад 0
Крейг прав, я исправил свой ответ. js. 13 лет назад 0
1
Jarrod Roberson

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

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

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

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

0
dwj

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

grep -rl "string" */*java 
Это дает «grep: * / * java: нет такого файла или каталога» в Mac OS X. John Topley 15 лет назад 1
Проблема здесь в том, что он найдет файлы * .java только на один уровень глубиной. См. Ответ Марка Талмана для ИМХО, как правильно это сделать. Ludwig Weinzierl 15 лет назад 0
Извините, не на моем Mac. Разве для версии grep для Mac нет флага -r (рекурсивный)? dwj 15 лет назад 0
Это так, но это был вывод, который я получил при поиске строки, которая, как я знаю, находится в файлах. John Topley 15 лет назад 0
0
laughing_man
grep "(your string)" -rl $(find ./ -name "*.java") 

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

-1
Mark Thalman

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

Похожие вопросы