регулярное выражение, чтобы исключить типы файлов из find
При использовании команды find
в linux можно добавить флаг -regex
который использует выражения emacs regualr для соответствия.
Я хочу найти все файлы, кроме файлов .jar
и .ear
файлов. каково было бы регулярное выражение в этом случае?
благодаря
Ответы
Ответ 1
Здесь вам не нужно регулярное выражение. Вы можете использовать find
с параметрами -name
и -not
:
find . -not -name "*.jar" -not -name "*.ear"
Более краткий (но менее читаемый) вариант выше:
find . ! \( -name "*.jar" -o -name "*.ear" \)
Ответ 2
EDIT: Новый подход:
Поскольку регулярные выражения POSIX не поддерживают lookaround, вам нужно отрицать результат совпадения:
find . -not -regex ".*\.[je]ar"
Ранее опубликованный ответ использует lookbehind и, следовательно, здесь не будет работать, но здесь он для полноты:
.*(?<!\.[je]ar)$
Ответ 3
find . -regextype posix-extended -not -regex ".*\\.(jar|ear)"
Это выполнит эту работу, и я лично считаю ее более понятной, чем некоторые другие решения. К сожалению, -regextype требуется (загромождать простую команду), чтобы заставить группу захвата работать.
Ответ 4
Использование регулярного выражения в этом случае звучит как излишний (вы можете просто проверить, заканчивается ли имя чем-то). Я не уверен в синтаксисе emacs, но что-то вроде этого должно быть достаточно общим для работы:
\.(?!((jar$)|(ear$)))
т.е. найти точку (.), за которой не следует конец ($) "jar" или (|) "ухо".