Coder Perfect

linux find regex

Problem

I’m having problems using the locate command’s regex. It’s probably something to do with command line escaping that I don’t understand.

Why aren’t they the same?

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

Bash, Ubuntu

Asked by Dijkstra

Solution #1

You should look into the -regextype parameter of find, which can be found in the 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:]]'

Answered by bmk

Solution #2

The default regular expression syntax used by find does not handle regular expressions with character classes (e.g. [[:digit:]]). To utilize them, you must specify a separate regex type, such as posix-extended.

Look through the Regular Expression documentation in GNU Find to see all of the regex types and what they support.

Answered by dogbane

Solution #3

It’s worth noting that -regex is path-dependent.

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

For what you’re doing, you don’t need to use -regex.

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

Answered by kurumi

Solution #4

You might try ‘.*[0-9]’ instead.

Answered by StKiller

Post is based on https://stackoverflow.com/questions/5635651/linux-find-regex