Unix查找命令中的数字的正则表达式

时间:2011-01-10 21:28:00

标签: regex unix command-line find

我有这个命令:

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的任何排列,而且parens逃避工作。

更新:根据以下接受的答案,这对我有用:

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\)"

4 个答案:

答案 0 :(得分:6)

这是我过去使用的:

Year: (19|20)[0-9][0-9]
Month:  0[1-9]|1[012]
Day: (0[1-9]|[12][0-9]|3[01])

您可以将这些放在正则表达式中。当然,你必须逃离支架和管道。

答案 1 :(得分:4)

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

答案 2 :(得分: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\)"

答案 3 :(得分:0)

你可以使用这样的中继器:

find ./ -regextype posix-egrep -iregex ".*\._[0-9]{8}-[0-9]{6}.*"

我用它来查找表单的备份:

./foo._20140716-121745.OLD

foo是原始名称,而数字是日期和时间。

(在CentOS 6.5上)

P.S。 -regextype posix-extended也有效。