Я не могу понять, как правильно использовать 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
сработало правильно.