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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.