Это регулярное выражение в стиле emacs
?
Если нет, попробуйте использовать -regextype
. Со страницы руководства find
в Linux (архаичный):
-regextype type
Изменяет синтаксис регулярного выражения, понятный тестам -regex
и -iregex
, которые выполняются позже в командной строке. В настоящее время реализованы типы emacs
(по умолчанию), posix-awk
, posix-basic
, posix-egrep
и posix-extended
.
В MacOS X на странице руководства для find
написано:
-iregex pattern
Как и -regex
, но совпадение не чувствительно к регистру.
-regex pattern
Истина, если полный путь к файлу соответствует шаблону с использованием регулярного выражения. Чтобы сопоставить файл с именем ./foo/xyzzy
, вы можете использовать регулярное выражение .*/[xyz]*
или .*/foo/.*
, но не xyzzy
или /foo/
.
Некоторые эксперименты показывают, что:
find pdf -iregex ".*/.*.pdf"
находит в моей папке очень много файлов PDF, но ни один из этих вариантов ничего не находит:
find pdf -iregex ".*/.*\.(pdf|doc|docx)"
find pdf -iregex ".*/.*\.\(pdf|doc|docx\)"
find pdf -iregex ".*/.*.(pdf|doc|docx)"
find pdf -iregex ".*/.*.\(pdf|doc|docx\)"
Следовательно, необходимо предположить, что регулярные выражения, поддерживаемые MacOS X (BSD) find
, не включают чередование (круглые скобки и каналы) среди распознанных символов. «Жаль, что man 7 re_format
подразумевает, что может, но это не так. Кажется, опция -regextype
не поддерживается в MacOS X (BSD).
Итак, может быть проще всего установить GNU find
, или выполнить N отдельных поисков для N различных расширений файлов, или выполнить один поиск файлов в целом и использовать egrep '\.(aff|wave?|aiff)$'
, чтобы перехватить интересующие вас файлы in. Это скорее предполагает, что вы не используете переводы строк в именах файлов (пробелы и т. д. в порядке, но переводы строк нет).