Как мне использовать grep для поиска в текущем каталоге всех файлов, содержащих строку «hello», но отображающих только файлы .h и .cc?


142

Как использовать grep для поиска в текущем каталоге любых файлов, содержащих строку «hello», и отображения только файлов .h и .cc?

Ответы:


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

Это гласит: рекурсивный поиск (также во всех подкаталогах) всех файлов .cc ИЛИ .h, содержащих "hello" в этом .(текущем) каталоге.

Из другого вопроса 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, даже при использовании утилиты GNU grep.
xApple,

49

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

grep hello *.h *.cc

Мне также нужны все подкаталоги
stackoverflow

К -Rсожалению, добавление не работает. Он расширяет *до рекурсивного выполнения.
Дональд Майнер,

Ответ Нуфаля - это то, что вы ищете, если вам нужны подкаталоги,
Дональд Майнер,

9
@Jammin Вы должны четко понимать это, задавая вопрос. Этот ответ является «правильным» ответом на заданный вами вопрос.
jordanm

$ 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" {} +пара скобок представляет имя (имена) файла. Хорошее предложение.
Джонатан Леффлер,

11

Для рекурсивного поиска в текущем каталоге:

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

Это может привести к появлению нескольких имен, которые вы не планировали, потому что сопоставление с образцом нечеткое (но более простое), но в остальном работает. И он работает с версиями findи, отличными от GNU xargs.


обратите внимание, вы также можете сказатьfind ... -exec grep "hello" {} +
fedorqui 'SO, stop harming'

5

Если я внимательно прочитал ваш вопрос, вы просите «grep искать в текущем каталоге все файлы, содержащие строку« hello », и отображать только файлы .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 Psy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.