Wie kann ich mit „find“ eine „oder“-Suche durchführen?

Wie kann ich mit „find“ eine „oder“-Suche durchführen?

Im Wesentlichen möchte ich wissen, wie man zwei (oder mehr) Suchbefehle in einem ausführt – eine „oder“-Suche statt einer „und“-Suche:

find . -name "*.pem"
find . -name "*.crt"

Antwort1

findDer „oder“-Operator von ist -o:

find . -name "*.pem" -o -name "*.crt"

Es ist ein Kurzschluss,dhDer zweite Teil wird nur ausgewertet, wenn der erste Teil falsch ist: Eine übereinstimmende Datei *.pemwird nicht getestet *.crt.

-ohat eine niedrigere Priorität als „und“, egal ob explizit ( -a) oder implizit; wenn Sie Operatoren kombinieren, müssen Sie den „oder“-Teil möglicherweise in Klammern setzen:

find . \( -name "*.pem" -o -name "*.crt" \) -print

In meinen Tests ist dies erwartungsgemäß deutlich schneller als die Verwendung eines regulären Ausdrucks (reguläre Ausdrücke sind aufwändiger zu testen als Globs und -regextesten den vollständigen Pfad und nicht nur den Dateinamen -name).

Antwort2

Während ich diese Frage eintippte, fiel mir auf, dass find standardmäßig Globbing statt regulärer Ausdrücke verwendet. Aber ich wette, es gibt eine Möglichkeit, reguläre Ausdrücke zu verwenden!

Sicherlich ... ich musste den Regex-Typ ändern, um POSIX-Extended zu verwenden, aber das hat mir das gebracht, was ich wollte.

find . -regextype posix-extended -regex ".*pem|.*crt"

Qaplah!

verwandte Informationen