420 Stimmen

Wie verwendet man regex mit dem Befehl find?

Ich habe einige Bilder mit einer generierten uuid1-Zeichenkette benannt. Zum Beispiel 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Ich möchte alle diese Bilder mit dem Befehl "find" herausfinden:

find . -regex "[a-f0-9\-]\{36\}\.jpg".

Aber es funktioniert nicht. Stimmt etwas mit der Regex nicht? Kann mir jemand dabei helfen?

15voto

binbjz Punkte 741

Einfacher Weg - Sie können .* am Anfang angeben, da find den gesamten Pfad abgleicht.

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

Version finden

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)

11voto

Lovely Punkte 109

Sie sollten den absoluten Verzeichnispfad verwenden, wenn Sie die Suchanweisung mit einem regulären Ausdruck anwenden. In Ihrem Beispiel ist der

find . -regex "[a-f0-9\-]\{36\}\.jpg"

sollte geändert werden in

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

In den meisten Linux-Systemen können einige Disziplinen in regulären Ausdrücken von diesem System nicht erkannt werden, so dass Sie explizit -regexty angeben müssen wie

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"

1voto

Mark Punkte 1012

Wenn Sie die plattformübergreifende Kompatibilität aufrechterhalten wollen, konnte ich keine eingebaute Regex-Suchoption finden, die mit verschiedenen Versionen von find auf kohärente Art und Weise.

Kombinieren Sie mit grep

  1. Wie von @yarian vorgeschlagen, können Sie eine übergreifende Suche durchführen und dann die Ausgabe durch grep laufen lassen:

find . | grep -E '<POSIX regex>'

Dies wird wahrscheinlich langsam sein, aber Sie erhalten eine plattformübergreifende Regex-Suche, wenn Sie einen vollständigen regulären Ausdruck verwenden müssen und Ihre Suche nicht als Globus

Umschreiben als Glob

  1. En -name ist kompatibel mit Globs, die einen begrenzten (aber plattformübergreifenden) Mustervergleich ermöglichen.

Sie können alle Muster verwenden, die Sie auch in der Befehlszeile verwenden würden, wie * ? {} ** . Obwohl nicht so mächtig wie eine vollständige Regex, können Sie Ihre Suche je nach Anwendungsfall in Globs umformulieren.

Internet-Suche nach Klumpen - zahlreiche Tutorials mit detaillierten Informationen über die volle Funktionalität sind online verfügbar

1voto

Kevin Punkte 2501

Eine Sache, die ich nicht behandelt sehe, ist, wie man reguläre Ausdrücke mit der regulären Such-Syntax kombiniert.

Z.B.: Ich möchte Core-Dump-Dateien auf BSD/Linux finden, ich wechsle zum Root, den ich scannen möchte z.B: cd / dann ausführen:

find \( -path "./dev" -o -path "./sys" -o -path "./proc" \) -prune -o -type f -regextype sed -regex ".*\.core$" -exec du -h {} \; 2> /dev/null

Ich verwende also den Befehl prune, um mehrere Systemverzeichnisse auszuschließen, bevor ich die verbleibenden Dateien mit dem regulären Ausdruck bearbeite. Alle Fehlerausgaben (stderr) werden gelöscht.

Wichtig ist, dass Sie zuerst die Find-Syntax und dann OR (-o) mit dem regulären Ausdruck verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X