
Ich habe die folgenden Dateien und muss sie wie folgt zuordnen:
./foo.bar1.sh -match
./qux/foo.bar2.sh -match
./foo.sh -match
./baz.sh -no match
./foo.bar3 -no match
Ich habe versucht:
find . -regex ".*foo(bar[0-9])?\.sh"
Aber es gibt nichts zurück. Ich kann nicht herausfinden, warum dieser reguläre Ausdruck nicht funktioniert.
Antwort1
Ihr regulärer Ausdruck weist zwei Fehler auf:
Nach fehlt ein (buchstäblicher) Punkt
foo
.find
erfordert, dass Sie die Klammern verlassen, wennnichtals wörtliche Klammern verwendet.
Außerdem sollten Sie den Punkt vor maskieren sh
, da er mit jedem Zeichen übereinstimmt.
Der korrigierte Befehl lautet nun:
find . -regex ".*foo\(\.bar[0-9]\)?\.sh"
Fehler 2 ist übrigens der Grund, warum mir find
der -regex
Schalter von nicht gefällt: Inkonsistentes Escapen.
Es funktioniert natürlich, grep -P
verwendet aber Perl Compatible Regular Expressions (PCRE), bietet also mehr Funktionen, aber weniger Überraschungen und Fallstricke.
Persönlich würde ich Folgendes verwenden:
find . | grep -P "foo(\.bar\d)?\.sh"