Wie verwende ich find richtig mit regulären Ausdrücken?

Wie verwende ich find richtig mit regulären Ausdrücken?

Ich kann die korrekte Verwendung von „Find“ mit der Option nicht herausfinden -regex:

Nehmen wir beispielsweise dieses Beispiel:

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

Ich möchte nur die Zeichenfolge in der Form path/to/file/## filename.extohne den Punkt abgleichen.

Ich habe es versucht mit:

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

und einige Variationen, aber ich bekomme immer alle Dateien oder keine.

Was ist falsch?

Dank im Voraus.

Antwort1

Beachten Sie, dass -regex/ -iregex(GNU-Erweiterungen) wie die Standardübereinstimmung -pathmit dem vollständigen Pfad und nicht nur mit dem Dateinamen übereinstimmt.

Wenn Sie Dateien finden möchten, derenName(im Gegensatz zuWeg) mit zwei Dezimalstellen beginnt, gefolgt von etwas, das keine Dezimalstelle ist, und mit endet .flac, könnten Sie Folgendes portabel tun:

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

Beachten Sie, dass es nicht mit übereinstimmt, 01.flacda [!0-9]dort keine Übereinstimmung möglich ist. Stattdessen könnten Sie Folgendes schreiben:

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

Diese verwenden Platzhaltermuster, keine regulären Ausdrücke.

findUm GNUs zu verwenden -iregex, wären die Entsprechungen:

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

Das heißt, wir verankern die beiden Ziffern am Anfang, da wir sicherstellen, dass der Rest des regulären Ausdrucks nicht über ein hinausgeht /.

Antwort2

Wie von @steeldriver vorgeschlagen, hat der reguläre Ausdruck .*[0-9]{2}[^.]*\.flacordnungsgemäß funktioniert.

verwandte Informationen