Как использовать grep для поиска в текущем каталоге любых файлов, содержащих строку «hello», и отображения только файлов .h и .cc?
142
grep -r --include=*.{cc,h} "hello" .
Это гласит: рекурсивный поиск (также во всех подкаталогах) всех файлов .cc ИЛИ .h, содержащих "hello" в этом .
(текущем) каталоге.
grep -si "hello" --include=*.{cc,h} ./* ./.*
(также ищет скрытые файлы). Вот общая версия для поиска строки во всех файлах / скрытых:grep -s "hello" * .*
. Может быть , наиболее вообще полезно (и самый простой), это поиски все не-скрытые файлы «привет»:grep -si "hello" ./*
Благодаря этому сообщению: askubuntu.com/a/777456grep -r --include=*.{java,py} "hello" .
Вы можете использовать подстановочные знаки вместо указания имен файлов или использования стандартного ввода.
источник
-R
сожалению, добавление не работает. Он расширяет*
до рекурсивного выполнения.$ grep -R hello *
# найти из всех слов, содержащих привет (включая подкаталог)find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.Проверьте страницы руководства
find
иxargs
для деталей.источник
-print0
после,'*.cc'
иначе у вас не будет действия для этой части поиска. Или вы должны вставить скобки там:find . \( -name '*.cc' -or -name '*.h' \) -print0
.find -exec +
синтаксис вместо xargs-exec grep "hello" {} +
пара скобок представляет имя (имена) файла. Хорошее предложение.Для рекурсивного поиска в текущем каталоге:
grep -r 'myString' .
источник
Если вам нужен рекурсивный поиск, у вас есть множество вариантов. Вы должны подумать
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
Это может привести к появлению нескольких имен, которые вы не планировали, потому что сопоставление с образцом нечеткое (но более простое), но в остальном работает. И он работает с версиями
find
и, отличными от GNUxargs
.источник
find ... -exec grep "hello" {} +
Если я внимательно прочитал ваш вопрос, вы просите «grep искать в текущем каталоге все файлы, содержащие строку« hello », и отображать только файлы .h и .cc». Итак, чтобы удовлетворить ваши точные требования, вот мое заявление:
Это отображает имена файлов:
grep -lR hello * | egrep '(cc|h)$'
... и это отобразит имена и содержимое файлов:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
источник
Возможно, вы захотите
shopt -s nullglob
избежать сообщений об ошибках, если нет файлов .h или .cc.источник
Самый простой способ: grep -Ril "Ваш текст" /
источник