it-swarm.com.de

Wie verwende ich reguläre Ausdrücke mit dem Befehl find?

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

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

Aber es geht nicht. Stimmt etwas mit dem Regex nicht? Könnte mir jemand dabei helfen?

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

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

Beispiel:

[email protected]:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
[email protected]:~/so$ 
[email protected]:~/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) 
[email protected]:~/so$ 
[email protected]:~/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'.
298
Susam Pal

Der Suchausdruck -regex stimmt mit ganzer Name überein, einschließlich des relativen Pfads aus dem aktuellen Verzeichnis. Bei find . beginnt dies immer mit ./, dann mit beliebigen Verzeichnissen.

Dies sind auch emacs reguläre Ausdrücke, die andere Escape-Regeln als die üblichen regulären egrep-Ausdrücke haben.

Wenn diese alle direkt im aktuellen Verzeichnis sind, dann

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

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

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

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

72
Paŭlo Ebermann

Nach anderen Antworten zu urteilen, scheint dies der Fehler von find zu sein.

Sie können dies jedoch stattdessen auf folgende Weise tun:

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

Möglicherweise müssen Sie das grep ein wenig optimieren und je nach Wunsch verschiedene Optionen verwenden, aber es funktioniert.

29
yarian

Versuchen Sie, einfache Anführungszeichen (') zu verwenden, um zu vermeiden, dass die Zeichenfolge durch Shell ersetzt wird. Denken Sie daran, dass der Ausdruck mit dem gesamten Pfad übereinstimmen muss, d. H. Wie folgt aussehen muss:

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

Abgesehen davon scheint mein Fund (GNU 4.4.2) nur grundlegende reguläre Ausdrücke zu kennen, insbesondere nicht die Syntax {36}. Ich denke, Sie müssen darauf verzichten.

7
thiton

Einfacher Weg - Sie können. * Am Anfang angeben, da find dem gesamten Pfad entspricht.

$ 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)
7
binbjz

Sie sollten den absoluten Verzeichnispfad verwenden, wenn Sie eine Suchanweisung mit regulärem Ausdruck anwenden. In Ihrem Beispiel ist das

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 des regulären Ausdrucks von diesem System nicht erkannt werden. Sie müssen also ausdrücklich auf -regexty wie hinweisen

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

nter Mac OS X (BSD find): Wie bei der akzeptierten Antwort wird das Präfix .*/ benötigt, um einen vollständigen Pfad zu finden:

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

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

4
Stan Kurdziel