web-dev-qa-db-fra.com

linux find regex

Je ne parviens pas à utiliser l'expression régulière de la commande find. Probablement quelque chose que je ne comprends pas à propos d'échapper à la ligne de commande.

Pourquoi ne sont-ils pas les mêmes?

find -regex '.*[1234567890]'
find -regex '.*[[:digit:]]'

Bash, Ubuntu

70
Dijkstra

Expressions régulières avec des classes de caractères (par exemple, [[:digit:]]) ne sont pas pris en charge dans la syntaxe d’expression régulière par défaut utilisée par find. Vous devez spécifier un type de regex différent, tel que posix-extended afin de les utiliser.

Jetez un oeil à GNU L'expression régulière de Find documentation ), qui vous montre tous les types de regex et ce qu'ils supportent.

53
dogbane

Vous devriez regarder le -regextype argument de find, voir page de manuel :

      -regextype type
          Changes the regular expression syntax understood by -regex and -iregex 
          tests which occur later on the command line.  Currently-implemented  
          types  are  emacs (this is the default), posix-awk, posix-basic, 
          posix-egrep and posix-extended. 

J'imagine que le type emacs ne prend pas en charge le [[:digit:]] construire. Je l'ai essayé avec posix-extended et cela a fonctionné comme prévu:

find -regextype posix-extended -regex '.*[1234567890]'
find -regextype posix-extended -regex '.*[[:digit:]]'
69
bmk

Notez que -regex dépend du chemin entier.

 -regex pattern
              File name matches regular expression pattern.  
              This is a match on the whole path, not a search.

Vous n'êtes pas obligé d'utiliser -regex pour ce que vous faites.

find . -iname "*[0-9]"
27
kurumi

Eh bien, vous pouvez essayer ceci '.*[0-9]'

1
StKiller