Comment utiliser regex avec la commande find?

j'ai quelques images nommées avec la chaîne uuid1 générée. Par exemple 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Je veux trouver toutes ces images en utilisant la commande "find":

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

mais ça ne marche pas. Quelque chose ne va pas avec le regex? Quelqu'un pourrait-il m'aider?

212
demandé sur thoslin 2011-07-27 17:05:03

7 réponses

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

notez que vous devez spécifier .*/ au début car find correspond à l'ensemble du chemin.

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

ma version de 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'.
251
répondu Susam Pal 2011-07-27 13:38:20

l'expression -regex correspond au nom entier , y compris le chemin relatif à partir du répertoire courant. Pour find . cela commence toujours par ./ , puis tous les répertoires.

ce sont aussi des expressions régulières emacs , qui ont d'autres règles d'échappement que les expressions régulières habituelles egrep.

si ceux-ci sont tous directement dans le répertoire courant, alors

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

devrait marcher. (Je ne suis pas vraiment sûr - je ne peux pas obtenir la répétition compté pour travailler ici.) Vous pouvez passer aux expressions egrep par -regextype posix-egrep :

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

(notez que tout ce qui est dit ici est pour GNU find, Je ne sais rien de celui de BSD qui est aussi celui par défaut sur Mac.)

60
répondu Paŭlo Ebermann 2016-10-10 18:44:29

à en juger par d'autres réponses, il semble que ce soit la faute de find.

cependant vous pouvez le faire de cette façon à la place:

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

vous pourriez avoir à modifier le grep un peu et utiliser différentes options en fonction de ce que vous voulez, mais il fonctionne.

25
répondu yarian 2011-07-27 13:33:51

essayez d'utiliser des guillemets simples (') pour éviter que shell échappe à votre chaîne. Rappelez-vous que l'expression doit correspondre à l'ensemble du chemin, c.-à-d. doit ressembler à:

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

en dehors de cela, il semble que ma find (GNU 4.4.2) ne connaisse que les expressions régulières de base, surtout pas la syntaxe {36}. Je pense que vous avez à faire sans elle.

6
répondu thiton 2011-07-27 13:26:36

vous devez utiliser absolute directory path lorsque vous appliquez l'instruction find avec l'expression regular. Dans votre exemple, le

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

doit être remplacé par

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

dans la plupart des systèmes Linux, certaines disciplines en expression régulière ne peuvent pas être reconnues par ce système, vous devez donc explicitement signaler out-regexty comme

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"
6
répondu Lovely 2016-03-30 07:20:05

manière Simple-vous pouvez spécifier .* au début, de trouver des correspondances tout le chemin.

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

trouver la version

$ 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)
3
répondu binbjz 2018-04-17 11:32:34

sur Mac (BSD find) : même réponse que acceptée, le préfixe .*/ est nécessaire pour correspondre à un chemin complet:

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

man find dit -E utilise étendu regex support

0
répondu Stan Kurdziel 2018-08-31 23:33:11