Linux "find -regex" verarbeitet keine Bindung

Linux "find -regex" verarbeitet keine Bindung

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:

  1. Nach fehlt ein (buchstäblicher) Punkt foo.

  2. finderfordert, 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 findder -regexSchalter von nicht gefällt: Inkonsistentes Escapen.

Es funktioniert natürlich, grep -Pverwendet 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"

verwandte Informationen