Ich habe einige Bilder mit der generierten Zeichenfolge uuid1 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? Könnte mir jemand dabei helfen?
Antworten:
Beachten Sie, dass Sie
.*/
am Anfang angeben müssen, da diesfind
dem gesamten Pfad entspricht.Beispiel:
Meine Version von find:
quelle
"^ ... $"
Ihr regulärer Ausdruck implizit ist . Es muss mit der GANZEN Ergebnislinie übereinstimmen./
in brauchst,.*/
weil es.*
mit null oder mehr von (fast) jedem Charakter übereinstimmt.\{36\}
valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
-regextype
Flagge vor der-regex
Flagge steht, da sie sonst nicht gilt!Der
-regex
Suchausdruck entspricht dem gesamten Namen , einschließlich des relativen Pfads aus dem aktuellen Verzeichnis. Dennfind .
das beginnt immer mit./
dann Verzeichnissen.Dies sind auch
emacs
reguläre Ausdrücke, für die andere Regeln gelten als für die üblichen egrep-regulären Ausdrücke.Wenn sich diese alle direkt im aktuellen Verzeichnis befinden, dann
sollte arbeiten. (Ich bin mir nicht sicher - ich kann die gezählte Wiederholung hier nicht zum Laufen bringen.) Sie können zu egrep-Ausdrücken wechseln, indem Sie
-regextype posix-egrep
:(Beachten Sie, dass alles, was hier gesagt wird, für GNU-Fund ist. Ich weiß nichts über das BSD, das auch auf dem Mac Standard ist.)
quelle
posix-egrep
funktionierte der Typ für mich.-regextype
ist eine Option für GNUfind
und nicht für BSD (zumindest nicht für Mac BSD)find
. Wenn diese Option nicht verfügbar ist, müssen Sie GNU find installieren. Wenn auf einem Mac, ist das mit dem Brühpaket möglichfindutils
. Find ist dann über verfügbargfind
.Nach anderen Antworten zu urteilen, scheint dies die Schuld von find zu sein.
Sie können dies jedoch stattdessen folgendermaßen tun:
find . * | grep -P "[a-f0-9\-]{36}\.jpg"
Möglicherweise müssen Sie den Grep ein wenig optimieren und verschiedene Optionen verwenden, je nachdem, was Sie möchten, aber es funktioniert.
quelle
find
‚s --prune
Funktionalität , die ganz bestimmte Verzeichnisse überspringen. Meistens ist das nicht wirklich wichtig, aber es ist erwähnenswert.unter Mac OS X (BSD-Suche) : Wie bei der akzeptierten Antwort wird das
.*/
Präfix benötigt, um einem vollständigen Pfad zu entsprechen:man find
sagt-E
verwendet erweiterte Regex-Unterstützungquelle
-E
nicht verfügbar auf Ubuntu (getestet auf WSL Ubuntu)Versuchen Sie, einfache Anführungszeichen (') zu verwenden, um zu vermeiden, dass die Shell aus Ihrem String entweicht. Denken Sie daran, dass der Ausdruck mit dem gesamten Pfad übereinstimmen muss, dh wie folgt aussehen muss:
Abgesehen davon scheint mein Fund (GNU 4.4.2) nur grundlegende reguläre Ausdrücke zu kennen, insbesondere nicht die {36} -Syntax. Ich denke, du musst ohne auskommen.
quelle
Einfacher Weg - Sie können. * Am Anfang angeben, da find mit dem gesamten Pfad übereinstimmt.
Version finden
quelle
Sie sollten den absoluten Verzeichnispfad verwenden, wenn Sie eine Suchanweisung mit regulären Ausdrücken anwenden. In Ihrem Beispiel ist die
sollte geändert werden in
In den meisten Linux-Systemen können einige Disziplinen im regulären Ausdruck von diesem System nicht erkannt werden, daher müssen Sie explizit auf -regexty like hinweisen
quelle