регулярное выражение, чтобы исключить типы файлов из 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" или (|) "ухо".