Я бы просто пропустил это через секунду, grep
чтобы удалить их:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
-v
Переворачивает матч, печать строки , которые не соответствуют шаблону и -P
позволяет Perl Compatible Regular Expressions , которые позволяют нам использовать отрицательные Утверждения назад . Это конкретное регулярное выражение будет соответствовать .js
тому, чему не предшествует то, debug
каким образом (поскольку мы инвертируем совпадения) .js
будут напечатаны только эти файлы.
Однако, как указал @QuestionOverflow в комментариях, это может привести к непреднамеренному побочному эффекту отфильтровывания строк , содержащих OK
и js
так как grep -v
применяется ко всему выводу, а не только к имени файла. Чтобы избежать этого, просто добавьте двоеточие (это то, что grep
используется для отделения имен файлов от содержимого файлов):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Это все равно не удастся, если ваша строка ввода содержит foo.js:
или если ваше имя файла содержит :
. Итак, чтобы быть уверенным, используйте другой подход:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
-T
Приводит grep
к печати вкладки между именем файла и содержимое файла. Итак, если мы просто добавим a \t
в конец регулярного выражения, оно будет сопоставляться только с именами файлов, а не с содержимым строки.
Тем не менее, использованиеfind
может иметь больше смысла независимо.
OK
и.js
в одной строке?find
вероятно, лучше для такого рода вещей. Получение праваgrep
может быть сложно, как вы указали :).failglob
в оболочке установлена опция:bash: no match: --exclude=*~
вам нужно заключить в кавычки аргументы шаблона GLOB,--exclude
чтобы скрыть их от расширения оболочки, например--exclude={\*~,\*.map}
Я бы использовал,
find
чтобы найти файлы и передать результат черезxargs
:Это ищет каждый файл, не соответствующий "
*~
", "*.map
" или "*.js
но не*.debug.js
".Используя его,
find
вы можете легко искать довольно сложные правила, и этот подход избавляет вас от случайного удаления ложных срабатываний, как это может случиться с doublegrep
.источник
-exec grep OK {} +
вместоxargs
и избежать дополнительной программы.-exec +
нет-exec \;
, так как будет запускаться как можно меньше команд, очень похожеxargs
.С
zsh
вами можно сделать:При условии, конечно, список аргументов не слишком длинный, и в этом случае вы всегда можете сделать:
источник
zsh
:autoload zargs
иzargs some/dir/**/^(*~|*.map|(^*debug).js) -- grep OK
Если вы не возражаете против того, чтобы увидеть результат немного не в порядке (если вы это сделаете, вы можете отсортировать его):
Для этого требуется, чтобы ваша оболочка поддерживала
**
рекурсивное сглаживание: zsh работает «из коробки», bash - после запускаshopt -s globstar
, ksh93 - после запускаset -o globstar
.Без
**
поддержки в оболочке вы можете использовать две команды grep:источник
**
, но, похоже, что-то не так с дополнительным аргументом**/*.debug.js
, в результате чего grep интерпретируетсяOK
как каталог. Вы пытались запустить его?Вы можете использовать
ripgrep
. По умолчанию он игнорирует скрытые файлы и уважает ваш.gitignore
файл.Вы можете указать правила включения или исключения, используя следующие параметры:
Вот несколько простых примеров:
Вот полное решение исключить
*.~
,*.map
,*.js
, но не*.debug.js
:Тестирование:
источник