Como usar corretamente o find com expressão regular?

Como usar corretamente o find com expressão regular?

Não consigo descobrir o uso correto da -regexopção find com:

Por exemplo, dado este exemplo:

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

Quero apenas corresponder a string no formulário path/to/file/## filename.ext, sem o ponto.

Eu tentei com:

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

e algumas variações, mas sempre recebo todos os arquivos ou nenhum.

O que está errado?

Desde já, obrigado.

Responder1

Observe que -regex/ -iregex(extensões GNU), como a -pathcorrespondência padrão no caminho completo, não apenas no nome do arquivo.

Se você quiser encontrar arquivos cujosnome(em oposição acaminho) começa com 2 dígitos decimais, seguido por algo que não é um dígito decimal e termina em .flac, você poderia fazer de forma portável:

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

Observe que não corresponderia 01.flacporque [!0-9]não pode corresponder lá. Em vez disso, você poderia escrever:

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

Eles usam padrões curinga, não expressões regulares.

Para usar GNU find's -iregex, os equivalentes seriam:

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

Ou seja, ancoramos os dois dígitos no início, pois garantimos que o restante da regexp não abrange a /.

Responder2

Conforme sugerido por @steeldriver, o regex .*[0-9]{2}[^.]*\.flacfuncionou corretamente.

informação relacionada