Знайдіть файли, що містять заданий текст


153

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

Як би я це зробив?


4
Чи думали ви просто використовувати grep? cyberciti.biz/faq/grep-in-bash
Терранс

Цей заголовок є досить оманливим. "find-files-
Josh C

Відповіді:


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

rПрапор означає рекурсивний пошук (пошук підкаталоги). iПрапор означає чутливий до регістру.

Якщо ви просто хочете, щоб імена файлів додали прапор l(малі літери L):

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

це, здається, не працює на мене (принаймні, не на Mac) .... просто висить ... egrep -lir --include = * "repo" egrep: попередження: рекурсивний пошук stdin
Дін Хіллер

13
Ви забули додати шлях до пошуку. Шлях - "." у наведеному прикладі. У вашому випадку сценарій чекає на вхід для пошуку на stdin. Спробуйте: egrep -lir --include = * "repo" / (або будь-який інший шлях)
LodeRunner

1
grep -E ... >egrep ...
Аман

Я отримав помилку grep: (error|fail): No such file or directoryна Ubuntu Desktop 16; якісь підказки?
Нам Г ВУ

Щоб я це працював, мені довелося пропустити * з \. так що у мене--include=\*.{php,html,js}
Мехрад Махмудян

53

Спробуйте щось подібне grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-iробить його випадок insensitlve

.на кінцях означає , що ви хочете , щоб почати з поточного каталогу, це може бути замінений будь-каталог.

що -rозначає зробити це рекурсивно, прямо вниз по дереву каталогів

-nдрукує номер рядка для матчів.

--includeдозволяє додавати імена файлів, розширень. Знак підстановки прийнятий

Для отримання додаткової інформації див: http://www.gnu.org/software/grep/


4
Або, можливо, скористайтеся -lопцією (просто надрукуйте імена файлів, які відповідають) замість-n
glenn jackman

15

findїх і grepдля рядка:

Тут ви знайдете всі ваші 3 типи в / start / 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
Як універсальне використання знахідки, але на мій погляд краще використовувати-exec grep -l 'sth' {} \;
NGix

Дякуємо @Michael Berkowski Цей шлях швидше більш ніж 5 або 8 разів # egrep -ir --include=file.foo "(foo|bar)" /dirу ваговій папці ~ 500Gb.
Qh0stM4N

9

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

Або ця чудова конструкція:

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

+1 Використання -exec grep...краще, ніж мій xargsметод, оскільки він не задихається пробілами у файлах імен.
Михайло Берковський

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

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

3

Просто, щоб включити ще одну альтернативу, ви також можете скористатися цією:

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

Де

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

... Далі від найелегантнішого способу. Як я вже говорив, мій намір - збільшити коло можливостей (а також дати більш повні пояснення щодо деяких інструментів, які ви могли б використовувати).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.