¿Cómo utilizar correctamente buscar con expresión regular?

¿Cómo utilizar correctamente buscar con expresión regular?

No puedo entender el uso correcto de buscar con -regexla opción:

Por ejemplo, dado este ejemplo:

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

Solo quiero hacer coincidir la cadena en el formulario path/to/file/## filename.ext, sin el punto.

Lo he probado con:

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

y alguna variación, pero siempre obtengo todos los archivos o ninguno.

¿Qué ocurre?

Gracias de antemano.

Respuesta1

Tenga en cuenta que -regex/ -iregex(extensiones GNU), como la -pathcoincidencia estándar en la ruta completa, no solo en el nombre del archivo.

Si desea buscar archivos cuyosnombre(Opuesto acamino) comienza con 2 dígitos decimales, sigue con algo que no sea un dígito decimal y termina en .flac, puedes hacerlo de forma portátil:

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

Tenga en cuenta que no coincidirá 01.flacporque [!0-9]no puede coincidir allí. En su lugar podrías escribirlo:

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

Estos usan patrones comodín, no expresiones regulares.

Para usar GNU find, -iregexlos equivalentes serían:

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

Es decir, anclamos los dos dígitos al principio, ya que nos aseguramos de que el resto de la expresión regular no abarque un archivo /.

Respuesta2

Según lo sugerido por @steeldriver, la expresión regular .*[0-9]{2}[^.]*\.flacfuncionó correctamente.

información relacionada