Unix查找命令中用于匹配数字的正则表达式

10

我有这个命令:

find reports/ -type f -mtime +90 -regex ".*\.\(csv\|sql\|txt\|xls\|zip\)"

我需要加强它,使得文件扩展名之前的部分与YYYY/MM/DD模式匹配,如下所示:

reports/2010/10/10/23.txt
reports/2010/10/10/23.xls
reports/2010/10/10/26.csv
reports/2010/10/10/26.sql
reports/2010/10/10/26.txt
reports/2010/10/10/26.xls
reports/2010/10/10/27.csv

但我无法让\d和圆括号的任何排列方式生效。

更新:以下是根据下面接受的答案对我有效的内容:

find reports/ -type f -mtime +90 -regex "reports/201[01]/\([1-9]\|1[012]\)/\([1-9]\|[12][0-9]\|3[01]\)/.*\.\(csv\|sql\|txt\|xls\|zip\)"

请注意,-regex选项在Unix平台上并不是标准的。我认为它只存在于GNU find中。您可以通过将输出导入到egrep来使用更标准的方法。 - JOTN
4个回答

7
这是我过去使用过的内容:
Year: (19|20)[0-9][0-9]
Month:  0[1-9]|1[012]
Day: (0[1-9]|[12][0-9]|3[01])

您可以在正则表达式中将它们组合在一起。当然,您需要转义括号和管道符。


7

\d 是正则表达式的扩展,Emacs 正则表达式和 POSIX 正则表达式(这些是 find 支持的风格)不支持。您可以使用 [[:digit:]][0-9] 代替。


1
你可以使用 [0-9],但是是否可以使用 [[:digit:]] 取决于你使用的 -regextype。例如 emacs(默认类型)不支持它,而 posix-extended 支持。请参见 GNU findutils 手册:8.5 正则表达式 以获取底部链接的语法描述。 - zpea

3
以下代码不够优美,也没有过滤掉无效日期,但可能已经足够接近了:
find reports/ -type f -regex ".*/reports/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9][0-9]\.\(csv\|sql\|txt\|xls\|zip\)"

看起来不错(我稍后会测试一下),但是是否可以使用类似于“[0-9]{4}”这样的东西来缩小范围,而不是连续重复四次? - Teflon Ted
数字量词“{4}”在我的系统(libc 2.3.4)中使用的find版本中regexec的版本似乎无法工作。你的情况可能会有所不同。 - David J. Liszewski

1
您可以像这样使用Repeater:
find ./ -regextype posix-egrep -iregex ".*\._[0-9]{8}-[0-9]{6}.*"

我使用这个来查找表单的备份:
./foo._20140716-121745.OLD

其中foo是原始名称,数字表示日期和时间。

(在CentOS 6.5上)

P.S.-regextype posix-extended也可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接