Como usar corretamente encontrar com expressão regular?

0

Não consigo descobrir o uso correto de find com -regex option:

Por exemplo, dado este exemplo:

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

Eu só quero 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 alguma variação, mas eu sempre recebo todos os arquivos ou nenhum.

O que há de errado?

Obrigado antecipadamente.

    
por Daniele 23.05.2017 / 19:40

2 respostas

4

Observe que -regex / -iregex (extensões GNU), como o padrão -path , correspondem ao caminho completo, não apenas ao nome do arquivo.

Se você quiser encontrar arquivos cujo nome (em oposição a caminho ) comece com 2 dígitos decimais, seguindo por algo que não seja um dígito decimal e terminando em .flac , você poderia fazer portably:

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

Observe que não corresponderia em 01.flac porque o [!0-9] não pode corresponder a ele. 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 regexps.

Para usar o find do GNU -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, nós ancoramos os dois dígitos no início, pois nos certificamos de que o resto do regexp não abranja um / .

    
por 23.05.2017 / 21:01
0

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

    
por 23.05.2017 / 20:44