Как использовать grep для поиска в текущем каталоге для всех и всех файлов, содержащих строку "hello", и отображать только файлы .h и .cc?
Как использовать grep для поиска в текущем каталоге для всех файлов, имеющих строку "hello", но отображающие только файлы .h и .cc?
Ответ 1
grep -r --include=*.{cc,h} "hello" .
Это читает: поиск рекурсивно (во всех подкаталогах) для всех .cc ИЛИ .h файлов, которые содержат "hello" в этом каталоге .
(текущий)
Ответ 2
Вы можете передавать подстановочные знаки вместо указания имен файлов или использования stdin.
grep hello *.h *.cc
Ответ 3
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.
Подробнее см. страницы руководства для find
и xargs
.
Ответ 4
Если вам нужен рекурсивный поиск, у вас есть множество вариантов. Вы должны рассмотреть 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
.
Ответ 5
Если я внимательно прочитаю ваш вопрос, вы попросите "grep" найти текущий каталог для всех и всех файлов, содержащих строку "привет" и отображать только файлы .h и .cc ". Итак, чтобы удовлетворить ваши точные требования, вот мое выражение:
Отображаются имена файлов:
grep -lR hello * | egrep '(cc|h)$'
... и отобразите имена и содержимое файлов:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
Ответ 6
grep -l hello **/*.{h,cc}
Вы можете захотеть shopt -s nullglob
, чтобы избежать сообщений об ошибках, если нет файлов .h или no.cc.
Ответ 7
Самый простой способ: grep -Ril "Ваш текст" /