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


12

Як би я шукав у всіх .java-файлах простий рядок (а не регулярний вираз) у поточному каталозі та всіх підкаталогах на Mac OS X? Я просто хочу надрукувати список імен файлів і директорій, які відповідають.


Дякую за запитання, тому мені не потрібно. Тепер мені залишається лише розібратися, як виключити ".git", і я закінчив трохи.
Дан Розенстарк

Я думаю, що відповідь js є більш стислою, все-таки гадкою, що вам потрібно набрати --включити, але все ж. Може, можливо, просто написати псевдонім, щоб приховати це
Крейг Татарін

Відповіді:


19

І завжди популярний

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

EDIT (Франк Щебра):

Якщо ви маєте справу з назви файлів або каталогів, у яких є пробіли, найбезпечніший спосіб це зробити:

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'

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


Ви також можете скористатися параметром "--replace" у xargs, щоб мати справу з іменами файлів, у яких пробіли: ... | xargs --замініть grep 'string' '{}' ({} буде замінено на ім'я файлу)
arathorn

1
Сучасні версії знаходження (включаючи встановлену на OS X) підтримують "-exec <command> {} +", де знак "плюс" в кінці (замість \;) говорить знайти, щоб замінити {} на "якомога більше імен шляхів ... Це схоже на те, що у xargs (1) "(зі сторінки man).
Дуг Харріс

7

Використовуйте греп, який краще, ніж греп, ack :

ack -l --java  "string" 

3
ack не встановлено на Mac OS X за замовчуванням.
Джон Топлі

Я не знаю, що означає "за замовчуванням". У багатьох ОС ви вибираєте те, що встановлюєте, тому важко знайти програми, які завжди є. У свій час компілятор C завжди був там, і Perl був рідкістю ...
bortzmeyer

1
Це означає, що це частина стандартної установки ОС. У мене на моєму Mac встановлені інструменти для розробників, і вони не встановлюють ack. Ви повинні встановити його самостійно. Якщо у вас є, то це приємний синтаксис.
Джон Топлі

У випадку з ack, це єдина програма Perl без модульних залежностей. Якщо ви можете "встановити" програми у своєму каталозі ~ / bin, ви можете так само легко "встановити" ack.
Енді Лестер

4

Це дійсно буде використовувати регулярний вираз, якщо ви хочете, просто тримайтеся подалі від метахарактерів або уникайте їх, і ви можете шукати рядки.

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


3
grep -rl --include="*.java" simplestring *

1
Тут, здається, найкраща відповідь - якщо grep все це робить, навіщо використовувати find & xargs?
Пітер Гібсон

FYI, враховуючи те, що задано у запитанні, у цій команді має бути мало "l" не велике "L"
Крейг Татарін

Крейг має рацію, я виправив свою відповідь.
js.

1

Оскільки це питання щодо OSX, тут є більш конкретна відповідь для OSX.

Пропустіть findта скористайтеся Spotlightз командного рядка. Набагато потужніше!

КОМАНДА ЛІНІЙНОГО СВЯТЛЕННЯ - ЗНАЙДІТЬСЯ ЗАСОБИ ВЕЛИКИЙ

Більшість людей не знає, що ви можете шукати в центрі уваги з командного рядка. Навіщо пам’ятати про всі таємні варіанти пошуку та грепування, а що ні, коли ви можете дозволити Spotlight зробити роботу за вас. Інтерфейс командного рядка до прожектора називається mdfind. Він має таку ж потужність, що і пошук GUI Spotlight, і більше, тому що він написаний в командному рядку!


0

Дайте про це:

grep -rl "string" */*java

1
Це дає "grep: * / * java: У Mac OS X немає такого файлу чи каталогу"
John Topley

Проблема тут полягає в тому, що він знайде файли * .java лише на рівні рівня. Дивіться відповідь Марка Талмана для IMHO правильний спосіб це зробити.
Ludwig Weinzierl

Вибачте, не на моєму Mac. Чи не має версія grep для Mac -r (рекурсивний) прапор?
dwj

Так, але це був результат, який я отримав під час пошуку рядка, який я знаю, у файлах.
Джон Топлі

0

Ви також можете використовувати програму GUI типу TextWrangler, щоб зробити більш інтуїтивний пошук там, де параметри знаходяться в інтерфейсі.


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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.