我正在尝试以下方式递归查找以.py
或.py.server
结尾的文件:
$ find -name "stub*.py(|\.server)"
然而这不起作用。
我尝试了类似的变体:
$ find -name "stub*.(py|py\.server)"
它们也不起作用。
一个简单的find -name "*.py"
确实有用,那么regex
怎么没有呢?
答案 0 :(得分:33)
说:
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\)"
答案 1 :(得分:6)
查找可以采用正则表达式模式:
$ find . -regextype posix-extended -regex '.*[.]py([.]server)?$' -print
选项:
-regex pattern
文件名与正则表达式匹配。这是整个路径上的匹配,而不是搜索。例如,要匹配名为
./fubar3', you can use the regular expression
。* bar的文件。要么.*b.*3', but not
F。* R3' 。 find理解的正则表达式默认为Emacs 正则表达式,但可以使用-regextype选项进行更改。-print True;
在标准输出上打印完整文件名,然后输入换行符。如果你是管道 找到另一个程序的输出,并有文件哪个最微小的可能性 你正在搜索可能包含换行符,那么你应该认真考虑使用 -print0选项而不是-print。有关如何操作的信息,请参见“异常文件”部分 处理文件名中的异常字符。
-regextype type
更改稍后发生的-regex和-iregex测试所理解的正则表达式语法 命令行。目前实现的类型是emacs(这是默认值),posix-awk,posix- 基本的,posix-egrep和posix-extended。
更清晰的description或选项。不要忘记阅读man find
或info find
可以找到所有信息。
答案 2 :(得分:4)
find -name
不使用regexp,这是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而不是像regexp一样
如果我想通过regexp找到,我会做类似
的事情find . -type f -print | egrep 'stub(\.py|\.server)'