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?

473voto

Susam Pal Punkte 29750
find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

Beachten Sie, dass Sie Folgendes angeben müssen .*/ am Anfang, weil find entspricht dem gesamten Pfad.

Exemple :

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

Meine Version von find:

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 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.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.

124voto

Paŭlo Ebermann Punkte 70779

En -regex Suchausdruck mit dem ganzer Name einschließlich des relativen Pfads vom aktuellen Verzeichnis aus. Für find . dies beginnt immer mit ./ und dann alle Verzeichnisse.

Außerdem sind dies emacs reguläre Ausdrücke, die andere Escape-Regeln haben als die üblichen regulären Ausdrücke von egrep.

Wenn diese alle direkt im aktuellen Verzeichnis liegen, dann

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

sollte funktionieren. (Ich bin mir nicht ganz sicher - ich bekomme die gezählte Wiederholung hier nicht zum Laufen.) Sie können zu egrep-Ausdrücken wechseln durch -regextype posix-egrep :

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

(Beachten Sie, dass alles, was hier gesagt wird, für GNU find gilt, ich weiß nichts über die BSD-Version, die auch der Standard auf dem Mac ist).

54voto

yarian Punkte 5734

Nach den anderen Antworten zu urteilen, scheint es so, als ob dies ein Fehler von find sein könnte.

Sie können es aber auch auf diese Weise machen:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

Möglicherweise müssen Sie grep ein wenig anpassen und verschiedene Optionen verwenden, je nachdem, was Sie wollen, aber es funktioniert.

31voto

Stan Kurdziel Punkte 5058

unter Mac OS X (BSD-Fund) : Gleiche Wirkung wie die akzeptierte Antwort .

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

man find sagt -E verwendet erweiterte Regex-Unterstützung

ANMERKUNG: Die .*/ Präfix ist erforderlich, um einen vollständigen Pfad zu finden:

Zum Vergleich sehen Sie hier die GNU/Linux-Version:

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

15voto

thiton Punkte 35046

Versuchen Sie, einfache Anführungszeichen (') zu verwenden, um zu vermeiden, dass Ihre Zeichenkette von der Shell escaped wird. Denken Sie daran, dass der Ausdruck mit dem gesamten Pfad übereinstimmen muss, d.h. er muss wie folgt aussehen:

 find . -regex '\./[a-f0-9-]*.jpg'

Abgesehen davon scheint mein Find (GNU 4.4.2) nur einfache reguläre Ausdrücke zu kennen, insbesondere nicht die {36}-Syntax. Ich denke, Sie werden ohne sie auskommen müssen.

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