Как правильно использовать find с регулярным выражением?

Как правильно использовать find с регулярным выражением?

Я не могу понять, как правильно использовать find с -regexопцией:

Например, рассмотрим следующий пример:

Morcheeba/Big Calm/02 Shoulder Holster.flac
Morcheeba/Big Calm/02. Shoulder Holster.flac

Мне нужно только сопоставить строку в форме path/to/file/## filename.ext, без точки.

Я пробовал с:

find Morcheeba/ -regextype egrep -iregex ".*[0-9]{2}*[a-z]*flac$"

и некоторые вариации, но я всегда получаю все файлы или ни одного.

В чем дело?

Заранее спасибо.

решение1

Обратите внимание, что -regex/ -iregex(расширения GNU), как и стандартное -pathсоответствие, соответствует полному пути, а не только имени файла.

Если вы хотите найти файлы, чьиимя(в отличие отпуть) начинается с 2 десятичных цифр, за которыми следует что-то, что не является десятичной цифрой, и заканчивается на .flac, вы можете сделать переносимо:

find . -name '[0-9][0-9][!0-9]*.[fF][lL][aA][cC]'

Обратите внимание, что это не будет соответствовать, 01.flacпотому что [!0-9]не может соответствовать там. Вместо этого вы можете написать это:

find . -name '[0-9][0-9][!0-9]*' -name '*.[fF][lL][aA][cC]'

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

Для использования GNU findэквиваленты -iregexбудут такими:

find . -regextype egrep -iregex '.*/[0-9]{2}[^0-9/][^/]*\.flac'
find . -regextype egrep -iregex '.*/[0-9]{2}([^0-9/][^/]*)?\.flac'

То есть мы прикрепляем две цифры в начале, чтобы убедиться, что остальная часть регулярного выражения не охватывает /.

решение2

Как предположил @steeldriver, регулярное выражение .*[0-9]{2}[^.]*\.flacсработало правильно.

Связанный контент