Как я могу объединить find
и grep
для поиска str1
или str2
, рекурсивно, во всех файлах * .html и * .php, начиная с каталога с именем /home /smith /source? Выходные данные должны только перечислить файлы (с путем), а не фактическую совпавшую строку. Я попробовал много вариантов без успеха. Есть много примеров того, как сделать это для одного шаблона файла или одной строки, но не для нескольких шаблонов файла и нескольких строк - рекурсивно.
5 ответов
Другие все верны, но с современной версией grep, на мой взгляд, они излишни. Следующее будет рекурсивно проверять только файлы с расширениями .html или .php и возвращает имя файла с путем к каждому файлу, по крайней мере, с одной строкой, совпадающей либо с str1, либо с str2. Обратите внимание, что повторяющиеся опции -e
позволяют указывать несколько путей без использования синтаксиса регулярных выражений.
grep -r --files-with-matchs --include ' .html' --include '.php' -e str1 -e str2 /home /smith /source
Один инструмент, один процесс, без лишних разветвлений или сканирования ненужных файлов. Просто требуется относительно недавняя версия gnu grep для параметра --include, в противном случае вам придется выполнить многоступенчатый grep, как предложили другие.
egrep 'string1|string2' /home/smith/source/*.{html,php}
или рекурсивно просматривая любой тип файла в каталоге,
egrep -R 'string1|string2' /home/smith/source
Вы можете объединить это с другим egrep в трубе:
egrep -R 'string1|string2' /home/smith/source | egrep '.html|.php'
Если вы используете ack
(см. Http://beyondgrep.com), вы можете сделать это:
ack --php --html -l 'str1|str2' /home/smith/source
Используйте egrep
и используйте | указать str1 или str2-:
find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;
Не забывайте, что ваша оболочка намного удобнее, чем find
если вы хотите найти файлы только по имени!
Bash:
shopt -s nullglob globstar
grep -lE 'str1|str2' /home/smith/source/**/*.{html,php}
Рыба:
grep -lE 'str1|str2' /home/smith/source/**.{html,php}