Как исключить некоторые файлы, не соответствующие определенным расширениям grep?

su использует пароль root, в то время как sudo использует текущий пароль пользователя. По крайней мере, в Ubuntu пароль root скремблирован во время установки.

8
21.11.2018, 23:02
4 ответа
[118954] Я бы просто пропустил это через второе [119372]grep[119373], чтобы удалить их: [12187] [119374]-v[119375] меняет соответствие, печатая строки, которые не соответствуют шаблону, а [119376]-P[119377] включает Perl-совместимые регулярные выражения, которые позволяют использовать [119378]- отрицательные lookbehinds[119379]. Этот конкретный регекс, будет соответствовать [119380].js[119381], то есть [119382], а не [119383], заданный [119384] отладкой [119385], что означает (поскольку мы инвертируем совпадения), что будут распечатаны только те файлы [119386].js[119387]. Однако, как указал @QuestionOverflow в комментариях, это может привести к нежелательному побочному эффекту фильтрации строк [119388], которые содержат [119390]OK[119391] и [119392]js[119393], поскольку [119394]grep -v[119395] применяется ко всему выходному файлу, а не только к имени файла. Чтобы избежать этого, просто добавьте двоеточие (это то, что [119396]grep[119397] использует для отделения имени файла от содержимого файла):[12189]Это все равно не сработает, если Ваша строка ввода содержит [119398]foo.js:[119399] или если Ваше имя файла содержит [119400]:[119401]. Поэтому используйте другой подход: [12190]-T[119402]-T[119403] заставляет [119404]grep[119405] распечатать закладку между именем файла и его содержимым. Поэтому, если мы просто добавим [119406]-T[119407] в конец регекса, она будет совпадать только с именами файлов, а не с содержанием строки.[12191] Тем не менее, [119408] с помощью [119546] найдет [12192], возможно, будет иметь больший смысл, не смотря ни на что.[118965].
7
27.01.2020, 20:08
[118966]Я бы использовал [119410]найти[119411], чтобы найти файлы и пропустить результат через [119412]xargs[119413]:[12193]Это поиск каждого файла [119414]не[119415], совпадающего с "[119416]*~[119417]", "[119418]*.map[119419]" или "[119420]*. js[119421], но не [119422]*.debug.js[119423]".[12194]Используя [119424]find[119425] можно легко искать достаточно сложные правила, и такой подход избавляет вас от случайного удаления ложных срабатываний, как это может произойти с двойным [119426]grep[119427].[118971].
7
27.01.2020, 20:08
[119016]С помощью [119466]zsh[119467] можно сделать:[12214]При условии, конечно, что список аргументов не слишком длинный, и в этом случае всегда можно сделать:[12215]
4
27.01.2020, 20:08

Если вы не возражаете, что вывод будет немного не в порядке (если да, вы можете его отсортировать):

grep -r --exclude={*~,*.map,*.js} "OK" /some/dir **/*.debug.js

Это требует, чтобы ваша оболочка поддерживала ** для рекурсивного globbing: zsh - из коробки, bash - после выполнения shopt -s globstar, ksh93 - после выполнения set -o globstar.

Без поддержки ** в оболочке можно использовать две команды grep:

grep -r --exclude={*~,*.map,*.js} "OK" /some/dir
grep -r --include=*.debug.js "OK" /some/dir
2
27.01.2020, 20:08

Теги

Похожие вопросы