75

I'm having trouble using the regex of the find command. Probably something I don't understand about escaping on the command line.

Why are these not the same?

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

Bash, Ubuntu

1
  • What output do you have to indicate that they are not? Commented Apr 12, 2011 at 13:16

4 Answers 4

73

You should have a look on the -regextype argument of find, see manpage:

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

I guess the emacs type doesn't support the [[:digit:]] construct. I tried it with posix-extended and it worked as expected:

find -regextype posix-extended -regex '.*[1234567890]' find -regextype posix-extended -regex '.*[[:digit:]]' 
Sign up to request clarification or add additional context in comments.

1 Comment

I thought it might be that, but I checked the emacs regex definitions and they appear to support [:digit:]. gnu.org/software/emacs/manual/html_node/elisp/…
57

Regular expressions with character classes (e.g. [[:digit:]]) are not supported in the default regular expression syntax used by find. You need to specify a different regex type such as posix-extended in order to use them.

Take a look at GNU Find's Regular Expression documentation which shows you all the regex types and what they support.

2 Comments

Thanks. That document is the one I should have been looking for. All I could find was gnu.org/software/emacs/manual/html_node/elisp/… - which seemed to suggest that character classes were supported in "emacs regex mode".
Also check Regular_expression#Character_classes - very helpful resource
30

Note that -regex depends on whole path.

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

You don't actually have to use -regex for what you are doing.

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

1 Comment

The excplicit dot is unneeded here, too ;)
1

Well, you may try this '.*[0-9]'

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.