У bash я хочу повернути ім'я файлу (і шлях до файлу) для кожного типу файлів, .php|.html|.js
що містить строку, нечутливу до регістру."document.cookie" | "setcookie"
Як би я це зробив?
У bash я хочу повернути ім'я файлу (і шлях до файлу) для кожного типу файлів, .php|.html|.js
що містить строку, нечутливу до регістру."document.cookie" | "setcookie"
Як би я це зробив?
Відповіді:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
r
Прапор означає рекурсивний пошук (пошук підкаталоги). i
Прапор означає чутливий до регістру.
Якщо ви просто хочете, щоб імена файлів додали прапор l
(малі літери L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
на Ubuntu Desktop 16; якісь підказки?
--include=\*.{php,html,js}
Спробуйте щось подібне grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
-i
робить його випадок insensitlve
.
на кінцях означає , що ви хочете , щоб почати з поточного каталогу, це може бути замінений будь-каталог.
що -r
означає зробити це рекурсивно, прямо вниз по дереву каталогів
-n
друкує номер рядка для матчів.
--include
дозволяє додавати імена файлів, розширень. Знак підстановки прийнятий
Для отримання додаткової інформації див: http://www.gnu.org/software/grep/
-l
опцією (просто надрукуйте імена файлів, які відповідають) замість-n
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)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
у ваговій папці ~ 500Gb.
Звучить як ідеальна робота для grep
або, можливо, ака
Або ця чудова конструкція:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
-exec grep...
краще, ніж мій xargs
метод, оскільки він не задихається пробілами у файлах імен.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Звичайно, можна додати й інші варіанти.
Просто, щоб включити ще одну альтернативу, ви також можете скористатися цією:
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
за бажанням).... Далі від найелегантнішого способу. Як я вже говорив, мій намір - збільшити коло можливостей (а також дати більш повні пояснення щодо деяких інструментів, які ви могли б використовувати).