Когда я хочу получить все html-файлы в каком-либо каталоге, я делаю следующее
grep --include="*.html" pattern -R /some/path
что хорошо работает. Проблема в том, как выполнить поиск всех файлов html, htm, php в каком-либо каталоге?
Из этого Используйте синтаксис grep --exclude / - include, чтобы не использовать grep через определенные файлы , кажется, что я могу сделать следующее
grep --include="*.{html,php,htm}" pattern -R /some/path
Но, к сожалению, у меня это не сработало.
К вашему сведению, моя версия grep - 2.5.1.
xargs
. Это также стоит быстро прочитать. HTH.*
по - прежнему подлежит универсализации как часть маркера он встроен в , это просто происходит не матч ничего в этом случае, потому что только те файлы , в буквальном смысле под названием что - то вроде--include=foo.html
бы совпадают. На всякий случай процитируйте*
(что вы можете сделать индивидуально\*
). В качестве дополнительного бонуса это делает визуально более понятным, что в данном случае подстановка должна выполняться не оболочкой .find
решения: использование-exec grep "pattern" {} +
вместо| xargs grep "pattern"
более надежно (например, обрабатывает имена файлов с пробелами), а также более эффективно.Использование
{html,php,htm}
может работать только в качестве расширения распорки , которая является нестандартной (не POSIX-совместимой) особенностьюbash
,ksh
иzsh
.Другими словами: не пытайтесь использовать его в сценарии, который нацелен
/bin/sh
- в этом случае используйте явные множественные--include
аргументы.grep
сам не понимает{...}
обозначений.Чтобы раскрытие фигурных скобок было распознано, это должен быть токен без кавычек (часть a) в командной строке.
Расширение скобки расширяется до нескольких аргументов , поэтому в рассматриваемом случае
grep
отображается несколько--include=...
параметров, как если бы вы передали их по отдельности.Результаты расширения скобки: подвергаются подстановке (расширению имени файла) , что имеет подводные камни :
Каждый результирующий аргумент может быть расширен до совпадающих имен файлов, если он содержит не заключенные в кавычки метасимволы подстановки, такие как
*
.Хотя это маловероятно с такими токенами, как
--include=*.html
(например, у вас должен быть файл, буквально названный чем-то вроде--include=foo.html
для чего-то сопоставимого), в целом об этом стоит помнить.Если
nullglob
опция оболочкиshopt -s nullglob
включена ( ) и подстановка совпадает ничего не соответствует , аргумент будет отброшен .Следовательно, для полностью надежного решения используйте следующее:
'--include=*.'
рассматривается как буквальный , так в одинарные кавычки ; это предотвращает случайную интерпретацию*
символа подстановки.{html,php,htm}
, - по необходимости - расширение фигурных скобок без кавычек [1] , расширяется до 3 аргументов, которые из-за{...}
прямого следования за'...'
токеном , включают в себя , что маркер.Следовательно, после удаления кавычек оболочкой в конечном итоге передаются следующие 3 буквальных аргумента
grep
:--include=*.html
--include=*.php
--include=*.htm
[1] Точнее, только релевантные синтаксису части раскрытия фигурных скобок должны быть не заключены в кавычки, элементы списка могут по-прежнему заключаться в индивидуальные кавычки и должны быть, если они содержат метасимволы подстановки, которые могут привести к нежелательному подстановке подстановки после раскрытия фигурных скобок; хотя в данном случае это и не обязательно, приведенное выше можно записать как
'--include=*.'{'html','php','htm'}
источник
bash
на любой платформе, на которойbash
работает.Попробуйте удалить двойные кавычки
источник
grep --include=\*.{html,php,htm} pattern -R /some/path
. У меня это сработало.это не работает?
источник
Попробуй это. -r выполнит рекурсивный поиск. -s подавляет ошибки "файл не найден". -n покажет вам номер строки файла, в котором найден шаблон.
источник
-I
в стандартный набор. Он пропускает двоичные файлы (которые почти никогда не просматриваются), что повышает эффективность. Затем мы идем,grep -rIns ...
который акустически красиво играет :)Он работает с той же целью, но без
--include
дополнительных возможностей. Он также работает с grep 2.5.1.источник
Использовать
grep
сfind
командойВы также можете использовать
-regex
и-regextype
параметры.источник