Я работаю над написанием некоторых сценариев для 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
Может кто-нибудь показать мне, как я бы сейчас добавил только конкретные расширения файлов?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP email@domain.com
. Работа выполнена.-r
чтобыgrep
они искали файлы, поскольку это нарушает мантру UNIX о наличии инструментов, которые «делают одно и делают это хорошо». Есть очень хороший инструмент для поиска файлов с ОЧЕНЬ очевидным именем.Ответы:
Просто используйте
--include
параметр, например так:это должно делать то, что вы хотите.
Чтобы получить объяснение из ответа HoldOffHunger ниже:
grep
: команда-r
: рекурсивно-i
: ignore-case--include \*.cpp
: все * .cpp: файлы C ++ (экранируйте с \ на всякий случай, если у вас есть каталог со звездочками в именах файлов)./
: Начать с текущего каталога.источник
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
Некоторые из этих ответов казались слишком синтаксическими или вызывали проблемы на моем Debian Server. Это отлично сработало для меня:
PHP Revolution: как Grep файлы в Linux, но только с определенными расширениями файлов?
А именно:
... или версия без учета регистра ...
grep
: команда-r
: рекурсивно-i
: ignore-case--include
: все * .txt: текстовые файлы (экранируйте \, если у вас есть каталог со звездочками в именах файлов)'searchterm'
: Что искать./
: Начать с текущего каталога.источник
*
использования\*.cpp
или'*.cpp'
. В противном случае он не даст ожидаемого результата, если в рабочем каталоге есть несколько*.txt
файлов.--include=<pattern>
но важно , чтобы избежать*
с--include <pattern>
(пробел вместо=
) , который чувствует себя очень похоже иначе.источник
--include
вариант после иглы, а не с другими вариантами?--
?Как насчет:
источник
-name
аргументы. странные вещи могут случиться, если вы этого не сделаете.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
можно дополнительно связывать аргументы, сводя к минимуму количество вызовов вызываемого процесса.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Это предложено, но не выделено в ответе @ fedorqui ниже и является значительным улучшением.-H
Аргумент Grep здесь полезен , когда найти только идентифицирует один файл соответствия. Это может исключить использование-print
в ответе. Если ваш общий список файлов достаточно мал,{path1,path2}/**/*.{cpp,h}
предпочтительнее использовать рекурсивный глобус оболочки (например, ).На серверах HP и Sun опция -r отсутствует, этот способ помог мне на моем сервере HP
-i для поиска строки без учета регистра
источник
ll
но не добавляет--color=auto
к grep.Так как это вопрос поиска файлов, давайте использовать
find
!Использование GNU найти можно использовать
-regex
опцию , чтобы найти эти файлы в дереве каталогов , чье расширение либо.h
или.cpp
:Тогда нужно просто выполнить
grep
каждый из его результатов:Если у вас нет этого распределения находок, вы должны использовать подход, подобный подходу Амира Афгани , с помощью которого
-o
объединяются варианты ( имя заканчивается либо на,.h
либо на.cpp
):И если вы действительно хотите использовать
grep
, следуйте синтаксису, указанному для--include
:источник
Самый простой способ
источник
ag
(Серебряный искатель) имеет довольно простой синтаксис для этоготак
источник
ag _string_to_find_ -G _filename_regex_
Ниже ответ хорош:
Но можно обновить до:
Что может быть проще.
источник
Следует написать «-exec grep» для каждого «-o -name»
Или сгруппировать их по ()
опция '-Hn' показывает имя файла и строку.
источник
Я знаю, что этот вопрос немного устарел, но я хотел бы поделиться методом, который я обычно использую для поиска файлов .c и .h :
или если вам нужен также номер строки:
источник