grep все файлы .java в каталоге для определенной строки
12
Как мне найти во всех файлах .java простую строку (не регулярное выражение) в текущем каталоге и во всех подкаталогах в Mac OS X? Я просто хочу напечатать список имен файлов и каталогов, которые совпадают.
Спасибо, что спросили, так что мне не нужно. Теперь мне просто нужно выяснить, как исключить ".git", и я немного покончил.
Дэн Розенстарк
Я думаю, что ответ JS является более кратким, все еще отстой, вы должны напечатать - включите, но все же. Может быть, просто написать псевдоним, чтобы скрыть это
Крейг Татарин
Ответы:
19
И всегда популярный
find . -name '*.java' | xargs grep -l 'string'
РЕДАКТИРОВАТЬ (Фрэнк Щерба):
Если вы имеете дело с именами файлов или каталогов, в которых есть пробелы, самый безопасный способ сделать это:
Традиционный ответ UNIX был бы тем, который был принят для этого вопроса:
find . -name '*.java' | xargs grep -l 'string'
Это, вероятно, будет работать для файлов Java, но пробелы в именах файлов гораздо чаще встречаются на Mac, чем в традиционном мире UNIX. Когда имена файлов с пробелами передаются через конвейер выше, xargs будет интерпретировать отдельные слова как разные имена.
Что вы действительно хотите, так это обнулить имена, чтобы сделать границы однозначными:
Альтернатива - позволить запустить run grep для вас, как предлагает Марк, хотя этот подход медленнее, если вы ищете большое количество файлов (поскольку grep вызывается один раз для файла, а не один раз для всего списка файлов).
Вы также можете использовать опцию "--replace" в xargs для работы с именами файлов, в которых есть пробелы: ... | xargs --replace grep 'string' '{}' ({} будет заменен именем файла)
arathorn
1
Современные версии find (включая версию, установленную в OS X) поддерживают «-exec <command> {} +», где знак «плюс» в конце (вместо \;) указывает найти для замены {} на «как можно больше путей» ... Это похоже на xargs (1) "(со страницы руководства).
Я не знаю, что означает «по умолчанию». На многих ОС вы выбираете то, что устанавливаете, поэтому сложно найти программы, которые всегда присутствуют. В то время компилятор C всегда был там, и Perl был необычным ...
bortzmeyer
1
Это означает, что это часть стандартной установки ОС. У меня установлены инструменты разработчика на моем Mac, и они не устанавливаются. Вы должны установить его самостоятельно. Если он у вас есть, то это хороший синтаксис.
Джон Топли
В случае с ack это одна Perl-программа без зависимостей от модулей. Если вы можете «установить» программы в вашем каталоге ~ / bin, то вы можете так же легко «установить» ack.
Энди Лестер
4
Это на самом деле будет использовать регулярное выражение, если вы хотите, просто держитесь подальше от метасимволов или избегайте их, и вы можете искать строки.
Большинство людей не знают, что вы можете выполнять поиск Spotlight из командной строки. Зачем запоминать все тайные варианты поиска и поиска, а что нет, когда вы можете позволить Spotlight сделать всю работу за вас. Интерфейс командной строки для Spotlight называется mdfind. Он обладает той же мощью, что и поиск Spotlight в GUI, и даже больше, потому что его можно создавать из командной строки!
Это дает «grep: * / * java: нет такого файла или каталога» в Mac OS X.
Джон Топли
Проблема здесь в том, что он найдет файлы * .java только на один уровень глубиной. См. Ответ Марка Талмана для ИМХО, как правильно это сделать.
Людвиг Вайнцерль
Извините, не на моем Mac. Разве в версии grep для Mac нет флага -r (рекурсивный)?
dwj
Да, но это был вывод, который я получил при поиске строки, которая, как я знаю, находится в файлах.
Джон Топли
0
Вы также можете использовать программу с графическим интерфейсом, такую как TextWrangler, для более интуитивного поиска, где параметры находятся в интерфейсе.
Если вы хотите игнорировать регистр, замените -rl на -irl. (ваша строка) также может быть регулярным выражением, если вы когда-нибудь увидите необходимость.
Ответы:
И всегда популярный
РЕДАКТИРОВАТЬ (Фрэнк Щерба):
Если вы имеете дело с именами файлов или каталогов, в которых есть пробелы, самый безопасный способ сделать это:
Всегда есть несколько способов сделать это.
источник
mdfind
это более OSXy способ сделать это !Традиционный ответ UNIX был бы тем, который был принят для этого вопроса:
Это, вероятно, будет работать для файлов Java, но пробелы в именах файлов гораздо чаще встречаются на Mac, чем в традиционном мире UNIX. Когда имена файлов с пробелами передаются через конвейер выше, xargs будет интерпретировать отдельные слова как разные имена.
Что вы действительно хотите, так это обнулить имена, чтобы сделать границы однозначными:
Альтернатива - позволить запустить run grep для вас, как предлагает Марк, хотя этот подход медленнее, если вы ищете большое количество файлов (поскольку grep вызывается один раз для файла, а не один раз для всего списка файлов).
источник
Используйте grep, который лучше, чем grep, ack :
источник
Это на самом деле будет использовать регулярное выражение, если вы хотите, просто держитесь подальше от метасимволов или избегайте их, и вы можете искать строки.
источник
источник
Так как это вопрос OSX, вот более конкретный ответ OSX.
Пропустить
find
и использоватьSpotlight
из командной строки. Гораздо мощнее!КОМАНДА LINE SPOTLIGHT - НАЙТИ ВСТРЕЧИ С GREP
источник
Дайте этому попробовать:
источник
Вы также можете использовать программу с графическим интерфейсом, такую как TextWrangler, для более интуитивного поиска, где параметры находятся в интерфейсе.
источник
Если вы хотите игнорировать регистр, замените -rl на -irl. (ваша строка) также может быть регулярным выражением, если вы когда-нибудь увидите необходимость.
источник