Hoe gebruik ik regex met de opdracht find?

Ik heb enkele afbeeldingen met de naam gegenereerde uuid1 string. Bijvoorbeeld 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Ik wil al deze afbeeldingen vinden met de opdracht “find”:

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

Maar het werkt niet. Is er iets mis met de regex? Kan iemand me hiermee helpen?


Antwoord 1, autoriteit 100%

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

Houd er rekening mee dat u in het begin .*/moet opgeven omdat findovereenkomt met het hele pad.

Voorbeeld:

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

Mijn versie van vinden:

$ 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'.

Antwoord 2, autoriteit 25%

De -regexzoekexpressie komt overeen met de hele naam, inclusief het relatieve pad van de huidige map. Voor find .begint dit altijd met ./, daarna eventuele directory’s.

Dit zijn ook emacsreguliere expressies, die andere escape-regels hebben dan de gebruikelijke egrep reguliere expressies.

Als deze allemaal rechtstreeks in de huidige map staan, dan

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

zou moeten werken. (Ik weet het niet zeker – ik krijg de getelde herhaling hier niet werkend.) Je kunt overschakelen naar egrep-expressies met -regextype posix-egrep:

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

(Merk op dat alles wat hier wordt gezegd voor GNU-vinding is, ik weet niets over de BSD-versie die ook de standaard is op Mac.)


Antwoord 3, autoriteit 10%

Afgaande op andere antwoorden, lijkt het erop dat dit de schuld van de vondst is.

U kunt het echter op deze manier doen:

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

Misschien moet je de grep een beetje aanpassen en verschillende opties gebruiken, afhankelijk van wat je wilt, maar het werkt.


Antwoord 4, autoriteit 4%

op Mac OS X (BSD zoeken): hetzelfde als het geaccepteerde antwoord, het voorvoegsel .*/is nodig om een volledig pad te vinden:

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

man findzegt dat -Euitgebreide regex-ondersteuning gebruikt


Antwoord 5, autoriteit 3%

Eenvoudige manier – u kunt in het begin .* specificeren omdat zoeken overeenkomt met het hele pad.

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

versie zoeken

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

Antwoord 6, autoriteit 2%

Probeer enkele aanhalingstekens (‘) te gebruiken om te voorkomen dat de shell van je string ontsnapt. Onthoud dat de uitdrukking moet overeenkomen met het hele pad, d.w.z. er moet uitzien als:

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

Buiten dat lijkt het erop dat mijn vondst (GNU 4.4.2) alleen elementaire reguliere expressies kent, vooral niet de {36}-syntaxis. Ik denk dat je het zonder moet doen.


Antwoord 7, autoriteit 2%

U moet het absolute directorypad gebruiken wanneer u zoekinstructie toepast met reguliere expressies.
In uw voorbeeld is de

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

moet worden gewijzigd in

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

In de meeste Linux-systemen kunnen sommige disciplines in reguliere uitdrukking niet door dat systeem worden herkend, dus u moet expliciet wijzen – Regexy zoals

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

Other episodes