2011-01-10 105 views
7

我有這樣的命令:正則表達式在Unix中位數find命令

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 

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

我需要來加強它,以便在文件擴展名之前的部分YYYY/MM/DD模式,像這樣匹配

但我沒有得到\d和parens轉義工作的任何排列。

UPDATE:這裏是基於下面的接受的答案爲我工作:

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

請注意,-regex選項在Unix平臺上不是標準的。我認爲它可能只在GNU發現。您可以通過將輸出管道輸送到egrep來執行更加標準的方法。 – JOTN 2011-01-10 21:52:48

回答

5

這是我在過去使用:

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

你可以把這些一起在你的正則表達式中。當然,你必須逃避括號和管道。

3

\d是正則表達式的擴展,它不是由Emacs的正則​​表達式和POSIX正則表達式的支持(這些都是口味find支持)。您可以改用[[:digit:]][0-9]

+1

你可以使用`[0-9]`,但是如果你可以使用`[[:digit:]]`取決於你使用了哪一種`-regextype`。例如`emacs`(默認類型)不支持它,而`posix-extended`則支持。有關底部鏈接的語法描述,請參見[GNU findutils手冊:8.5正則表達式](https://www.gnu.org/software/findutils/manual/html_node/find_html/Regular-Expressions.html)。 – zpea 2017-09-29 19:45:26

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

看起來不錯(我會稍微測試一下),但是可以用「[0-9] {4}」之類的東西來強化範圍,而不是連續重複四次? – 2011-01-11 01:49:12

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也可以。