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

#bash #find

#bash #Найти

Вопрос:

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

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

Комментарии:

1. Рассматривали ли вы возможность просто использовать grep? cyberciti.biz/faq/grep-in-bash

2. Это название довольно вводит в заблуждение. «найти-файлы-содержащие-заданный-текст»

Ответ №1:

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

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

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

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

Комментарии:

1. у меня это, похоже, не сработало (по крайней мере, не на Mac)…. просто зависает… egrep -lir —include=* «repo» egrep: предупреждение: рекурсивный поиск по stdin

2. Вы забыли добавить путь для поиска. В приведенном выше примере указан путь ‘.’. В вашем случае скрипт ожидает ввода для поиска в стандартном интерфейсе. Попробуйте: egrep -lir —include=* «repo» / (или любой другой путь)

3. grep -E ... > egrep ...

4. Я получил ошибку grep: (error|fail): No such file or directory на Ubuntu Desktop 16; есть какие-либо подсказки?

5. Для того, чтобы это заработало, мне пришлось пропустить * с . таким образом, у меня есть --include=*.{php,html,js}

Ответ №2:

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

-i делает это без учета регистра

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

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

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

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

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

Комментарии:

1. Или, возможно, используйте -l опцию (просто выведите совпадающие имена файлов) вместо -n

Ответ №3:

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

Это позволит найти все файлы ваших 3 типов в /starting /path и grep для регулярного выражения '(document.cookie|setcookie)' . Разделите на 2 строки обратной косой чертой просто для удобства чтения…

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

Комментарии:

1. Нравится универсальное использование find, но, на мой взгляд, лучше использовать -exec grep -l 'sth' {} ;

2. Благодаря @Michael Berkowski Этот способ работает быстрее более чем в 5 или 8 раз # egrep -ir --include=file.foo "(foo|bar)" /dir в каталоге весом ~ 500 ГБ.

Ответ №4:

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

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

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

Комментарии:

1. 1 Использование -exec grep... лучше моего xargs метода, потому что он не будет перегружать пробелы в именах файлов.

2. @MichaelBerkowski : Вы можете использовать это следующим образом, чтобы справиться с пробелами в именах файлов: find . -type f -print0 | xargs -0 -I {} grep "search_string" {} . Конечно, можно добавить и другие опции.

Ответ №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 как необязательный).

…ДАЛЕКО не самый элегантный способ. Как я уже сказал, мое намерение состоит в том, чтобы расширить диапазон возможностей (а также дать более полные объяснения некоторых инструментов, которые вы могли бы использовать).