如何在文件查找中使用正则表达式

Tre*_*ree 61 unix bash

我试图在3天或更久前找到所有文件的日期和所有文件.

find /home/test -name 'test.log.\d{4}-d{2}-d{2}.zip' -mtime 3
Run Code Online (Sandbox Code Playgroud)

它没有列出任何东西.这有什么问题?

Sie*_*geX 103

find /home/test -regextype posix-extended -regex '^.*test\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.zip' -mtime +3
Run Code Online (Sandbox Code Playgroud)
  1. -name使用球形表达式,也就是通配符.你想要的是什么 -regex
  2. 要按预期使用间隔,您需要通过 标志告诉find使用扩展正则表达式-regextype posix-extended
  3. 你需要逃避时期,因为在正则表达式中,一个时期具有任何单个字符的特殊含义.你想要的是一个字面周期表示\.
  4. 为了只匹配那些文件 较大超过3天的时候,你需要用一个前缀的号码+-mtime +3.

概念证明

$ find . -regextype posix-extended -regex '^.*test\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.zip'
./test.log.1234-12-12.zip
Run Code Online (Sandbox Code Playgroud)

  • 如果你碰巧在OS X上运行,那么使用`-E`.`找-E.-regex'heregex'`利用扩展(现代)正则表达式. (19认同)

Eri*_*rik 15

使用-regex not -name,并注意正则表达式与查找的内容匹配,例如"/home/test/test.log"而不是"test.log"

  • 感谢您和@dogbane 指出需要完整路径匹配。 (2认同)

Dig*_*oss 10

从...开始:

find . -name '*.log.*.zip' -a -mtime +1
Run Code Online (Sandbox Code Playgroud)

您可能不需要正则表达式,请尝试:

 find . -name '*.log.*-*-*.zip' -a -mtime +1
Run Code Online (Sandbox Code Playgroud)

你需要+1才能匹配1,2,3 ......


dog*_*ane 8

用途-regex:

从手册页:

-regex pattern
       File name matches regular expression pattern.  This is a match on the whole path, not a search.  For example, to match a file named './fubar3',  you  can  use  the
       regular expression '.*bar.' or '.*b.*3', but not 'b.*r3'.
Run Code Online (Sandbox Code Playgroud)

另外,我不相信find支持正则表达式扩展,例如\d.你需要使用[0-9].

find . -regex '.*test\.log\.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.zip'
Run Code Online (Sandbox Code Playgroud)


HMS*_*HMS 6

只是对用于搜索目录和文件的正则表达式进行了一点阐述

查找名称为 book 的目录

find . -name "*book*" -type d
Run Code Online (Sandbox Code Playgroud)

查找名称类似于 book word 的文件

find . -name "*book*" -type f
Run Code Online (Sandbox Code Playgroud)