Как использовать параметр grep --include для нескольких типов файлов?
Когда я хочу grep все html файлы в каком-то каталоге, я делаю следующее
grep --include="*.html" pattern -R /some/path
который хорошо работает. Проблема в том, как grep все html, htm, php файлы в каком-то каталоге?
Из этого Используйте синтаксис grep --exclude/- include, чтобы не grep через определенные файлы, кажется, что я могу сделать следующее
grep --include="*.{html,php,htm}" pattern -R /some/path
Но, к сожалению, это не сработало бы для меня.
FYI, моя версия grep - 2.5.1.
Ответы
Ответ 1
Вы можете использовать несколько флагов --include
. Это работает для меня:
grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/
Однако вы можете сделать это как Deruijter
. Это работает для меня:
grep -r --include=*.{html,php,htm} "pattern" /some/path/
Не забывайте, что для этого можно использовать find
и xargs
для:
find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
НТН
Ответ 2
Попробуйте удалить двойные кавычки
grep --include=*.{html,php,htm} pattern -R /some/path
Ответ 3
Использование {html,php,htm}
может работать только как расширение брекета, что является нестандартным (не POSIX- совместимая) функция bash
, ksh
и zsh
.
-
Другими словами: не пытайтесь использовать его в script, который нацелен на /bin/sh
- использовать в этом случае явные несколько аргументов --include
.
-
grep
сам не понимает обозначения {...}
.
Для распознавания фигурной скобки это должно быть некорректным (частью) маркером в командной строке.
Расширение скобки расширяется до нескольких аргументов, поэтому в случае grep
заканчивается просмотр нескольких параметров --include=...
, как если бы вы передали их отдельно.
Результаты расширения фигурной скобки подвержены globbing (расширение имени файла), у которого ловушки:
-
Каждый результирующий аргумент может быть дополнительно расширен до соответствия именам файлов, если он содержит метациклические символы без кавычек, такие как *
.
Хотя это маловероятно с токенами, такими как --include=*.html
(например, вы должны иметь файл, буквально названный как-то вроде --include=foo.html
для соответствия), его следует иметь в виду вообще.
-
Если опция оболочки nullglob
включена, то (shopt -s nullglob
), а globbing ничего не соответствует, аргумент будет отброшен.
Поэтому для полностью надежного решения используйте следующее:
grep -R '--include=*.'{html,php,htm} pattern /some/path
-
'--include=*.'
рассматривается как литерал из-за того, что он одинарный; это предотвращает непреднамеренную интерпретацию *
как символ глобуса.
-
{html,php,htm}
, необходимость - некотируемое расширение скобки [1]
, расширяет до 3 аргументов, которые из-за {...}
непосредственно следуют за токеном '...'
, включают этот токен.
-
Следовательно, после удаления цитаты оболочкой следующие 3 литерала в конечном итоге передаются в grep
:
-
--include=*.html
-
--include=*.php
-
--include=*.htm
[1] Точнее, только части, связанные с синтаксисом расширения фигурной скобки, которые должны быть не кавычками, элементы списка могут по-прежнему быть индивидуально процитированы и должны быть, если они содержат метасимволы globbing, которые могут привести к нежелательному globbing после расширения скобы; в то время как в этом случае это не обязательно, вышеупомянутое можно написать как
'--include=*.'{'html','php','htm'}
Ответ 4
Это не работает?
grep pattern /some/path/*.{html,php,htm}
Ответ 5
Попробуйте это.
-r будет выполнять рекурсивный поиск.
-s будет подавлять файлы, не найденные ошибки.
-n покажет вам номер строки файла, где найден шаблон.
grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}
Ответ 6
Используйте grep
с командой find
find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f
-exec grep PATTERN {} \+
Вы можете использовать опции -regex
и -regextype
.