Як я можу використовувати grep для пошуку в поточному каталозі всіх файлів, у яких рядок "привіт" ще відображається лише у форматі .h та .cc?


138

Як я можу використовувати grep для пошуку в поточному каталозі будь-яких файлів, що містять рядок "привіт" та відображати лише файли .h та .cc?

Відповіді:


161
grep -r --include=*.{cc,h} "hello" .

Це означає: пошук рекурсивно (у всіх підкаталогах також) для всіх .cc АБО .h файлів, що містять "привіт" у цій .(поточній) каталозі

З іншого питання stackoverflow


5
У початковому дописі ви сказали "поточний каталог", і нічого про необхідність його рекурсивно або в підкаталогах (я розумію, ви згадали про це в наступній публікації). Для тих, хто цікавиться, як це зробити лише в поточному каталозі, він grep -si "hello" --include=*.{cc,h} ./* ./.*(шукає також приховані файли). Ось загальна версія для пошуку рядка у всіх файлах / прихованих: grep -s "hello" * .*. Може бути , найбільш взагалі корисно (і найпростіший), це пошуки все не-приховані файли «привіт»: grep -si "hello" ./* Завдяки цьому повідомленню: askubuntu.com/a/777456
jbobbins

1
grep -r --include=*.{java,py} "hello" .

Чомусь це не працює на macOS, навіть коли використовується утиліта grep GNU.
xApple

49

Ви можете передавати підстановку замість вказівки імен файлів або використовувати stdin.

grep hello *.h *.cc

Мені потрібні і всі підкаталоги
stackoverflow

На -Rжаль, додавання не працює. Це розширюється *перед тим, як піти рекурсивно.
Дональд Майнер

Відповідь Нуфаля - те, що ви шукаєте, якщо вам потрібні підкаталоги
Donald Miner

8
@Jammin Ви повинні бути чітко про це, коли задаєте питання. Ця відповідь є "правильною" відповіддю на поставлене вами запитання.
Йорданм

$ grep -R hello *# знайти з усіх слів містять привіт (включаючи підкаталог)

19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Перегляньте сторінки findта інструкції для xargsотримання деталей.


1
Ви повинні мати -print0після цього, '*.cc'оскільки в іншому випадку у вас не буде дії для цієї частини пошуку. Або ви повинні вставити дужки там: find . \( -name '*.cc' -or -name '*.h' \) -print0.
Джонатан Леффлер

Дякуємо, що помітили це. Я відредагував відповідь, щоб "виправити" її.
Нуфал Ібрагім

3
Ви також можете використовувати find -exec +синтаксис замість xargs
jordanm

@jordanm: Так: -exec grep "hello" {} +там, де пара дужок представляє назви файлів. Гарна пропозиція.
Джонатан Леффлер

10

Для рекурсивного пошуку в поточному каталозі:

grep -r 'myString' .

5

Якщо вам потрібен рекурсивний пошук, у вас є різноманітні варіанти. Вам слід розглянути ack.

Якщо цього немає, якщо у вас є GNU findта xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

Використання /dev/nullзабезпечує отримання друкованих імен файлів; -print0і -0угод з іменами файлів , що містять пробіли (символи перекладу рядка і т.д.).

Якщо у вас немає небезпечних імен (з пробілами тощо), ви можете використовувати:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

Це може вибрати кілька імен, які ви не мали наміру, оскільки відповідність шаблону нечіткіша (але простіша), але в іншому випадку працює. І це працює з не-GNU версіями findта xargs.


Зауважте, ви також можете сказатиfind ... -exec grep "hello" {} +
fedorqui "Так перестаньте шкодити"

5

Якщо я уважно прочитав ваше запитання, ви попросите "grep шукати в поточному каталозі будь-які файли, що містять рядок" привіт ", і відображатимуть лише .h та .cc файли". Отже, щоб відповідати вашим точним вимогам, ось моє подання:

Тут відображаються назви файлів:

grep -lR hello * | egrep '(cc|h)$'

... і відображаються назви файлів та їх вміст:

grep hello `grep -lR hello * | egrep '(cc|h)$'`

2
grep -l hello **/*.{h,cc}

Ви shopt -s nullglobможете уникнути повідомлень про помилки, якщо немає .h або немає .cc файлів.


4
Я знаю, як користуватися google і т. Д. Я запитав це тут, оскільки в кількох відповідях є "-l", і приємно мати всю інформацію в одному місці.
Ендрю Свіфт

-l (нижній регістр "el") Пригнічує нормальний вихід. Друкує ім'я кожного вхідного файлу, з якого зазвичай було б надруковано вихід. Сканування / пошук припиняться при першій відповідності.
Rex CoolCode Charles

-1

Найпростіший спосіб: grep -Ril "Ваш текст" /


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