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


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

8 101

8 ответов:

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

это читает: поиск рекурсивно (во всех подкаталогах также) для all .cc или .H-файлы, которые содержат "привет" в этот . (текущего) каталога

из другого вопроса stackoverflow

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

grep hello *.h *.cc

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

Проверьте страницы руководства для find и xargs для сведения.

Если я внимательно прочитаю ваш вопрос, вы попросите " grep для поиска в текущем каталоге любые файлы содержит строку "hello" и только отображение .H и. CC файлы". Поэтому, чтобы удовлетворить ваши точные требования, вот мое представление:

это отображает имена файлов:

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

...и это отображение имен файлов и их содержимого:

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

Если вам нужен рекурсивный поиск, у вас есть различные варианты. Вы должны рассмотреть 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.

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

grep -r 'myString' .
grep -l hello **/*.{h,cc}

вы хотите shopt -s nullglob чтобы избежать сообщений об ошибках, если их нет .H или нет .cc файлы.

самый простой способ: grep-Ril "ваш текст"/