正则表达式匹配linux中的字符串“find”命令

时间:2013-10-01 08:08:05

标签: regex linux find

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

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

然而这不起作用。

我尝试了类似的变体:

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

它们也不起作用。

一个简单的find -name "*.py"确实有用,那么regex怎么没有呢?

3 个答案:

答案 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 findinfo 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)'