Как использовать параметр 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.