Linux найти регулярное выражение

У меня возникли проблемы с использованием регулярного выражения команды find. Возможно, что-то я не понимаю об экранировании в командной строке.

Почему они не то же самое?

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

Bash, Ubuntu

Ответ 1

Регулярные выражения с символьными классами (например, [[:digit:]]) не поддерживаются в синтаксисе регулярных выражений по умолчанию, используемом find. Для их использования вам нужно указать другой тип регулярного выражения, например posix-extended.

Взгляните на GNU Find Regular Expression документация, которая показывает вам все типы регулярных выражений и то, что они поддерживают.

Ответ 2

Вы должны посмотреть на аргумент -regextype find, см. 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. 

Я думаю, что тип emacs не поддерживает конструкцию [[:digit:]]. Я попробовал его с posix-extended и работал как ожидалось:

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

Ответ 3

Обратите внимание, что -regex зависит от всего пути.

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

Фактически вам не нужно использовать -regex для того, что вы делаете.

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

Ответ 4

Хорошо, вы можете попробовать этот '.*[0-9]'