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


70

我正在尝试查找所有带日期的文件和3天或更早之前的所有文件。

find /home/test -name 'test.log.\d{4}-d{2}-d{2}.zip' -mtime 3

它没有列出任何东西。怎么了

Answers:


119
find /home/test -regextype posix-extended -regex '^.*test\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.zip' -mtime +3
  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

21
如果您恰巧在OS X上运行,请使用-Efind -E . -regex 'theregex'以利用扩展的(现代)正则表达式。
i4niac

[0-9]{2}尚未在macO上为我工作,我不得不使用[0-9][0-9]
To Kra

1
需要扩展以使用可选组,即find -E . -iregex '^.*\.js(\.map)?$'
chris

@Chris看到“ -regextype posix-extended”
SiegeX

@SiegeX我先前的评论是为了防止有人发现有用的信息,以便使用可选组,您需要启用posix-extended并给出其外观示例。谢谢您的回答。
克里斯

16

使用-regex而不是-name,并且要注意,正则表达式与查找内容将匹配,例如“ /home/test/test.log”而不是“ test.log”


1
感谢您和@dogbane指出必须进行完整路径匹配。
安德鲁·基尔纳

13

从...开始:

find . -name '*.log.*.zip' -a -mtime +1

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

 find . -name '*.log.*-*-*.zip' -a -mtime +1

您需要+1才能匹配1、2、3 ...


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'.

另外,我不find支持regex扩展名\d。您需要使用[0-9]

find . -regex '.*test\.log\.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.zip'

5

只需很少的正则表达式搜索目录和文件

查找名称类似于书的直销

find . -name "*book*" -type d

查找名称如书本字的文件

find . -name "*book*" -type f
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.