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.ext
ohne 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 -path
mit 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.flac
da [!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.
find
Um 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}[^.]*\.flac
ordnungsgemäß funktioniert.