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)'