it-swarm-ru.tech

grep, но только определенные расширения файлов

Я работаю над написанием некоторых сценариев для grep определенных каталогов, но эти каталоги содержат всевозможные типы файлов.

Я хочу grep только .h и .cpp на данный момент, но, возможно, несколько других в будущем.

Пока что у меня есть:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

Может кто-нибудь показать мне, как я бы сейчас добавил только конкретные расширения файлов?

807
Jason

Просто используйте параметр --include, например так:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

это должно делать то, что вы хотите.

Синтаксические заметки:

  • -r - поиск рекурсивно
  • -i - регистр -нечувствительный поиск
  • --include=\*.${file_extension} - поиск файлов, которые соответствуют расширению (ям) или только шаблону файла
1121
Nelson

Некоторые из этих ответов казались слишком синтаксическими или вызывали проблемы на моем Debian Server. Это отлично сработало для меня:

PHP Revolution: как Grep файлы в Linux, но только с определенными расширениями файлов?

А именно:

grep -r --include=\*.txt 'searchterm' ./

... или версия без учета регистра ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: команда

  • -r: рекурсивно

  • -i: игнорировать

  • --include: все * .txt: текстовые файлы (экранируйте с\на всякий случай, если у вас есть каталог со звездочками в именах файлов)

  • 'searchterm': что искать

  • ./: начать с текущего каталога.

241
HoldOffHunger

Как насчет:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
47
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
44
Yuri Malov

На серверах HP и Sun опция -r отсутствует, этот способ помог мне на моем сервере HP

find . -name "*.c" | xargs grep -i "my great text"

-i для поиска строки без учета регистра

15
Sam B

Поскольку речь идет о поиске файлов, давайте использовать find!

Используя GNU найдите, вы можете использовать опцию -regex, чтобы найти эти файлы в дереве каталогов, расширение которых равно .h или .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Тогда это просто вопрос выполнения grep для каждого из его результатов:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Если у вас нет этого распределения находок, вы должны использовать такой подход, как Амир Афгани , используя -o для объединения опций (, имя либо заканчивается на .h, либо с .cpp):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

И если вы действительно хотите использовать grep, следуйте синтаксису, указанному для --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
11
fedorqui

Самый простой способ

find . -type  f -name '*.extension' | xargs grep -i string 
7
user3640130

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

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

или если вам нужен также номер строки:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
3
Tom

Ниже ответ хорош.

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

Но может быть обновлено до:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

Что может быть проще.

2
hao

ag (серебряный искатель) имеет довольно простой синтаксис для этого

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

так

ag -G *.h -G *.cpp CP_Image <path>
2
Eldamir

Следует написать "-exec grep" для каждого "-o -name"

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

Или сгруппировать их по ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

опция '-Hn' показывает имя файла и строку.

1
where23