开发者

Regex for digits in Unix find command

I have this command:

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

And I need to beef it up so the part before the file extensions matches a YYYY/MM/DD pattern, like so:

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

But I'm failing to get any permutation of \d and parens escaping to work.

UPDATE: here's what worked for me based on the accept开发者_StackOverflow社区ed answer below:

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


This is what I have used in the past:

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

You can put these together in your regex. You will, ofcourse, have to escape the brackets and pipes.


\d is an extension of regular expressions that is not supported by Emacs regular expressions and POSIX regular expressions (those are the flavours find supports). You can use [[:digit:]] or [0-9] instead.


The following is ugly and does not weed out invalid dates, but might be close enough:

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


You can use the repeaters like this:

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

I use this to find backups of the form:

./foo._20140716-121745.OLD

Where foo is the original name and the numbers are the date and time.

(on CentOS 6.5)

P.S. -regextype posix-extended works too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜