команда find с квантификатором регулярных выражений, например {1,2}

14

Я пытался создать командную строку find, которая найдет все файлы с номерами 1-99, но исключит все остальные.

например, я хочу найти myfile1 myfile99, но не myfile456 и не myfilebackup

Регулярное выражение, о котором я думаю, - myfile[1-9]{1,2}но я не могу заставить это работать с find.

find . -regex '.*myfile[0-9]{1,2}' ИЛИ find . -iname 'myfile[0-9]{1,2}'

Из того, что я вижу, это та {1,2}часть, которая не работает.

(кстати, вы можете использовать -name -regexвзаимозаменяемо?)

Любая помощь приветствуется.

Lukas88
источник
1
-iname-name) использовать глобусы , которые не имеют этот синтаксис.
10

Ответы:

10

Вы могли бы попробовать

find . -regex '.*myfile[0-9][0-9]?'

или

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \)
l0b0
источник
Спасибо - первая линия работает на меня. Я пробовал это с -iname, но я не думаю, что он поддерживает синтаксис, иначе я делаю что-то не так.
Lukas88
17

Если у вас есть GNU find, вы можете использовать другой тип регулярного выражения:

find . -regextype sed -regex '.*myfile[0-9]\{1,2\}'

Согласно GNU по умолчанию findиспользуется стерилизованный синтаксис регулярных выражений Emacs - Emacs поддерживает \{from,to\}синтаксис, но по крайней мере GNU findего не поддерживает.

Как ни странно, в справочном руководстве нет раздела о sedсинтаксисе регулярных выражений, поэтому кто знает, какие его части поддерживаются.

l0b0
источник
1
sedкак edпредставляется, является псевдонимом posix-basic, поэтому должна быть совместима с POSIX BRE (хотя поддерживает некоторые расширения , например \+). Он не совместим с GNU, sedгде, например, [\n]соответствует символу новой строки вместо обратной косой черты или nтребуется POSIX. Смотрите также -regextype posix-extendedо PREIX ERE (также .*myfile[0-9]{1,2}), также с такими расширениями, как \sили\<
Стефан
Я никогда не знал о -regextype. Кажется, что если вы используете, -regextype egrepкажется, что вы можете избежать обратной косой черты.
Шридхар Сарнобат