Я работаю над написанием некоторых сценариев для 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@domain.com
Может ли кто-нибудь показать мне, как теперь добавить только конкретные расширения файлов?
Ответ 1
Просто используйте параметр --include
, например:
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com
который должен делать то, что вы хотите.
Ответ 2
Некоторые из этих ответов казались слишком синтаксически тяжелыми или вызывали проблемы на моем сервере Debian. Это отлично сработало для меня.
grep -r --include=\*.txt 'searchterm' ./
... или нечувствительная к регистру версия...
grep -r -i --include=\*.txt 'searchterm' ./
-
grep
: команда
-
-r
: рекурсивно
-
-i
: ignore-case
-
--include
: all *.txt: текстовые файлы (побег с\на всякий случай, если у вас есть каталог со звездочками в именах файлов)
-
'searchterm'
: Что искать
-
./
: начать с текущего каталога.
Ответ 3
Как насчет:
find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
Ответ 4
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
Ответ 5
На серверах HP и Sun нет опции -r, таким образом, я работал на моем сервере HP
find . -name "*.c" | xargs grep -i "my great text"
-i - для нечувствительного к регистру поиска строки
Ответ 6
Так как это вопрос поиска файлов, используйте find
!
Используя поиск GNU, вы можете использовать опцию -regex
, чтобы найти эти файлы в дереве каталогов, расширение которых равно либо .h
, либо .cpp
:
find -type f -regex ".*\.\(h\|cpp\)"
# ^^^^^^^^^^^^^^^^^^^^^^^
Тогда это просто вопрос выполнения grep
для каждого из его результатов:
find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +
Если у вас нет этого дистрибутива find, вам нужно использовать такой подход, как Амир Афгани, используя -o
для конкатенации опций (имя либо заканчивается с .h
или с помощью .cpp
):
find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
И если вы действительно хотите использовать grep
, следуйте синтаксису, указанному на --include
:
grep "your pattern" -r --include=*.{cpp,h}
# ^^^^^^^^^^^^^^^^^^^
Ответ 7
Я знаю, что этот вопрос немного устарел, но я хотел бы поделиться методом, который я обычно использую, чтобы найти файлы .c и .h:
tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"
или если вам нужен номер строки:
tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
Ответ 8
Самый простой способ -
find . -type f -name '*.extension' | xargs grep -i string
Ответ 9
ag
(серебряный искатель) имеет довольно простой синтаксис для этого
-G --file-search-regex PATTERN
Only search files whose names match PATTERN.
так
ag -G *.h -G *.cpp CP_Image <path>
Ответ 10
Должен писать "-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" {} \;
option '-Hn' показывает имя файла и строку.