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