Найти файлы, содержащие заданный текст

В bash Я хочу вернуть имя файла (и путь к файлу) для каждого файла типа .php|.html|.js, содержащего строку без учета регистра "document.cookie" | "setcookie"

Как мне это сделать?

Ответ 1

egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

Флаг r означает рекурсивный поиск (поиск в подкаталогах). Флаг i означает, что регистр не учитывается.

Если вам просто нужны имена файлов, добавьте флаг l (строчные буквы L):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

Ответ 2

Попробуйте что-то вроде grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-i делает это регистронезависимым

. в конце означает, что вы хотите начать с текущего каталога, его можно заменить любым каталогом.

-r означает делать это рекурсивно, прямо вниз по дереву каталогов

-n печатает номер строки для совпадений.

--include позволяет добавлять имена файлов, расширения. Подстановочные знаки приняты

Для получения дополнительной информации см.: http://www.gnu.org/software/grep/

Ответ 3

find и grep для строки:

Здесь будут найдены все файлы трех типов в /start/path и grep для регулярного выражения '(document\.cookie|setcookie)'. Разделить на две строки с обратной косой чертой только для удобства чтения...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

Ответ 4

Звучит как идеальная работа для grep или, возможно, ack

Или эта замечательная конструкция:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

Ответ 5

find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

Ответ 6

Чтобы включить еще одну альтернативу, вы также можете использовать это:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Где:

  • -regextype posix-extended сообщает find, какое регулярное выражение ожидать
  • -regex "^.*\.(php|html|js)$" сообщает find, что имена файлов регулярных выражений должны совпадать с
  • -exec grep -EH '(document\.cookie|setcookie)' {} \; сообщает find выполнить команду (с ее параметрами и аргументами), указанную между опцией -exec и \; для каждого найденного файла, где {} обозначает, где находится файл путь идет в этой команде.

    а

    • E указывает grep использовать расширенное регулярное выражение (для поддержки круглых скобок) и...
    • H указывает grep печатать пути файлов до совпадений.

И, учитывая это, если вам нужны только пути к файлам, вы можете использовать:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Где

  • | [pipe] посылает вывод find следующей команде после этого (которая sed, затем sort)
  • r указывает sed использовать расширенное регулярное выражение.
  • s/HI/BYE/ сообщает sed заменить каждое первое вхождение (на строку) "HI" на "BYE" и...
  • s/(^.*):.*$/\1/ сообщает ему заменить регулярное выражение (^.*):.*$ (что означает группа [материал, заключенный в ()], включая все [.*= один или несколько символов любого типа] из начало строки [^] до "первой": "за ней следует что-нибудь до конца строки [$]) с помощью первой группы [\1] заменено регулярное выражение.
  • u говорит sort для удаления повторяющихся записей (возьмите sort -u как необязательный).

... FAR - самый элегантный способ. Как я уже сказал, мое намерение состоит в том, чтобы увеличить диапазон возможностей (а также дать более полное объяснение некоторых инструментов, которые вы могли бы использовать).