27

我正在尝试以下方法以递归方式查找以.pyor结尾的文件.py.server

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

但是,这不起作用。

我尝试过以下变体:

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

它们也不起作用。

一个简单find -name "*.py"的工作,为什么这regex不工作?

4

3 回答 3

41

说:

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\)"
于 2013-10-01T08:13:01.100 回答
7

Find 可以采用正则表达式模式:

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

选项:

-正则表达式模式

文件名匹配正则表达式模式。这是整个路径上的匹配,而不是搜索。例如,要匹配名为./fubar3', you can use the regular expression.*bar.'的文件。或 .*b.*3', but notf.*r3'。find 理解的正则表达式默认是 Emacs 正则表达式,但这可以通过 -regextype 选项进行更改。

-打印真;

在标准输出上打印完整的文件名,后跟换行符。如果您将 find 的输出传送到另一个程序,并且您正在搜索的文件很可能包含换行符,那么您应该认真考虑使用 -print0 选项而不是 -print。有关如何处理文件名中的异常字符的信息,请参阅 UNUSUAL FILENAMES 部分。

-regextype 类型

更改稍后在命令行中出现的 -regex 和 -iregex 测试所理解的正则表达式语法。当前实现的类型是 emacs(这是默认值)、posix-awk、posix-basic、posix-egrep 和 posix-extended。

更清晰的描述或选项。不要忘记所有可以通过阅读man findinfo find.

于 2013-10-01T08:18:26.223 回答
5

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)'
于 2013-10-01T08:21:59.027 回答