Regex соответствует строке в команде linux "find"

Я пытаюсь сделать следующее, чтобы рекурсивно искать файлы, заканчивающиеся на .py или .py.server:

$ find -name "stub*.py(|\.server)"

Однако это не работает.

Я пробовал варианты вроде:

$ find -name "stub*.(py|py\.server)"

Они тоже не работают.

Простой find -name "*.py" действительно работает, так как этот regex не работает?

Ответы

Ответ 1

Скажи:

find . \( -name "*.py" -o -name "*.py.server" \)

Таким образом, имена файлов будут соответствовать *.py и *.py.server.

От man find:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

EDIT: если вы хотите указать регулярное выражение, используйте параметр -regex:

find . -type f -regex ".*\.\(py\|py\.server\)"

Ответ 2

Find может принимать шаблон регулярного выражения:

$ find . -regextype posix-extended -regex '.*[.]py([.]server)?$' -print

Параметры:

-regex pattern

Имя файла соответствует шаблону регулярного выражения. Это совпадение по всему пути, а не к поиску. Например, чтобы соответствовать файлу с именем ./fubar3', you can use the regular expression. * Bar. ' или        .*b.*3', but not е. * R3. Регулярные выражения, понятые find, по умолчанию Emacs        Регулярные выражения, но это можно изменить с помощью параметра -regextype.

-print True;

напечатать полное имя файла на стандартном выходе, за которым следует новая строка. Если вы используете трубопроводы        вывод поиска в другую программу, и есть небольшая вероятность, что файлы, которые        вы ищете, может содержать новую строку, тогда вам следует серьезно подумать об использовании        -print0 вместо -print. См. Раздел UNUUAL FILENAMES для получения информации о том, как        используются необычные символы в именах файлов.

-regextype type

Изменяет синтаксис регулярного выражения, понятный в тестах -regex и -iregex, которые появляются позже        командной строки. В настоящее время реализованы типы emacs (это значение по умолчанию), posix-awk, posix-        basic, posix-egrep и posix-extended.

Более четкое описание или варианты. Не забывайте, что вся информация может быть найдена путем чтения man find или info find.

Ответ 3

find -name не использует regexp, здесь выдержка из man-страницы на Ubuntu 12.04

-name pattern
              Base of  file  name  (the  path  with  the  leading  directories
              removed)  matches  shell  pattern  pattern.   The metacharacters
              (`*', `?', and `[]') match a `.' at the start of the  base  name
              (this is a change in findutils-4.2.2; see section STANDARDS CON‐
              FORMANCE below).  To ignore a directory and the files under  it,
              use  -prune; see an example in the description of -path.  Braces
              are not recognised as being special, despite the fact that  some
              shells  including  Bash  imbue  braces with a special meaning in
              shell patterns.  The filename matching is performed with the use
              of  the  fnmatch(3)  library function.   Don't forget to enclose
              the pattern in quotes in order to protect it from  expansion  by
              the shell.

Таким образом, шаблон, который -name принимает, больше похож на glob оболочки и вовсе не похож на regexp

Если бы я захотел найти по regexp, я бы сделал что-то вроде

find . -type f -print | egrep 'stub(\.py|\.server)'