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