我有这个命令:
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\)"
答案 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
也有效。