Não consigo descobrir o uso correto da -regex
opçã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 -path
correspondê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.flac
porque [!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}[^.]*\.flac
funcionou corretamente.