我正在尝试以下方法以递归方式查找以.py
or结尾的文件.py.server
:
$ find -name "stub*.py(|\.server)"
但是,这不起作用。
我尝试过以下变体:
$ find -name "stub*.(py|py\.server)"
它们也不起作用。
一个简单find -name "*.py"
的工作,为什么这regex
不工作?
说:
find . \( -name "*.py" -o -name "*.py.server" \)
这么说会导致文件名匹配*.py
和*.py.server
.
来自man find
:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
编辑:如果要指定正则表达式,请使用以下-regex
选项:
find . -type f -regex ".*\.\(py\|py\.server\)"
Find 可以采用正则表达式模式:
$ find . -regextype posix-extended -regex '.*[.]py([.]server)?$' -print
选项:
-正则表达式模式
文件名匹配正则表达式模式。这是整个路径上的匹配,而不是搜索。例如,要匹配名为
./fubar3', you can use the regular expression
.*bar.'的文件。或.*b.*3', but not
f.*r3'。find 理解的正则表达式默认是 Emacs 正则表达式,但这可以通过 -regextype 选项进行更改。-打印真;
在标准输出上打印完整的文件名,后跟换行符。如果您将 find 的输出传送到另一个程序,并且您正在搜索的文件很可能包含换行符,那么您应该认真考虑使用 -print0 选项而不是 -print。有关如何处理文件名中的异常字符的信息,请参阅 UNUSUAL FILENAMES 部分。
-regextype 类型
更改稍后在命令行中出现的 -regex 和 -iregex 测试所理解的正则表达式语法。当前实现的类型是 emacs(这是默认值)、posix-awk、posix-basic、posix-egrep 和 posix-extended。
更清晰的描述或选项。不要忘记所有可以通过阅读man find
或info find
.
find-name
不使用正则表达式,这是 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
更像是一个shell glob,而不是一个正则表达式
如果我想通过正则表达式找到我会做类似的事情
find . -type f -print | egrep 'stub(\.py|\.server)'