2016-12-23 17 views
1

Я начинаю в сценарии bash, но вот моя проблемаНайти с регулярным выражением

Я боролся с поиском.

Когда я делаю find . ! -regex ".*(jpeg|jpg|gif|pdf)+$" найти ничего не найдено, хотя на самом деле файлы не с этим расширением. Как будто он не признает группу регулярных выражений

Я нашел find . ! \(-name '*.jpeg' -o -name '*.jpg' -o -name '*.gif' \)

Мой вопрос: Есть ли не лучший способ сделать это?

+0

Перед расширением файла вам не хватает '.'. – Inian

+1

Ваш метод '-name' на самом деле хорош и переносим (' -regex' не указан POSIX, это только расширение доступно в определенных версиях 'find', например GNU' find'). –

ответ

2

Надлежащий regEx должен был

find . ! -regex '.*\.\(jpeg\|jpg\|gif\|pdf\)' 

Обратите внимание на включение . после .*, чтобы соответствовать характеру перед расширением имени файла и избежать символа для каждого из типов связанных.

Помните, что вы отрицаете regEx, чтобы исключить файлы упомянутых расширений. Для того, чтобы на самом деле список файлы, необходимые только из этих расширений, падение ! как

find . -regex '.*\.\(jpeg\|jpg\|gif\|pdf\)' 
+1

О, действительно, я настолько тупой, падаю на это. – Biscuit

+0

@Biscuit: Это довольно приятная попытка! просто косметическая проблема, о которой не стоит волноваться! – Inian

1

Как будто он не признает группу регулярных выражений

Это именно то, что происходит.

В вашем регулярном выражении нет ничего плохого, но он написан на диалоге PCRE или ERE, который find не ожидает. Если вы скажете find интерпретировать его как ERE, это будет соответствовать, как вы хотели:

# GNU 
find . -regextype posix-extended ! -regex ".*(jpeg|jpg|gif|pdf)+$" 

# macOS 
find . -E ! -regex ".*(jpeg|jpg|gif|pdf)+$" 

Было бы также хорошо работать по умолчанию в Perl, Java, RE2, egrep, Баш =~, awk, и многое других инструментов, которые также используют PCRE или ERE.

Однако он не работает в Emacs или BRE, что и ожидает GNU и macOS соответственно.

Решение Inian работает, переписывая свой шаблон из стиля ERE в стиль Emacs, где вместо (|) используется (|) (а также другие улучшения).

tl; dr: копирование регулярного выражения из одного инструмента в другое подобно скопированию функции с Java на C#. Они выглядят очень похожими, и это может даже работать, но, скорее всего, потребуется хотя бы некоторая настройка.