要从目录中删除超过 5 天的文件,我们可以使用命令。
find /directory -type f -mtime +5 -delete
但是,就我而言,我只想删除名称中包含“YYYY-MM-DD”且超过 5 天的文件。
以下是一些文件名示例:
TEST_2016-11-20_14_02_52.log
server.log.2016-11-13
locsub.log.2016-12-04
wsgi.txt.2016-12-01
仅具有名称格式 ' 的文件年-月-日' 并且超过 5 天的内容应被删除。
如何使用正则表达式匹配 find 命令中的文件名?
答案1
使用 GNU find
:
find . -type f -mtime +5 \
-regextype egrep -regex '.*[0-9]{4}-[0-9]{2}-[0-9]{2}[^/]*$' \
-delete
正则表达式将匹配包含表单上的日期的路径名的基本名称中的任何字符串YYYY-MM-DD
。请注意,我们还可能匹配XXYYYY-MM-DDZZ
whereXX
和ZZ
are 一些其他字符。
最后[^/]*$
的确保我们实际上将表达式与当前路径名的基名进行匹配,并且意味着“请不要/
对字符串的其余部分进行匹配”。
使用 shell 通配符模式代替(更易于维护):
find . -type f -mtime +5 \
-name '*[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]*' \
-delete
请注意,这-mtime +5
是针对年龄为整数天数的文件严格地大于 5,因此 6 天及以上。对于 5 天或以上的文件,您需要-mtime +4
.
答案2
假设您正在使用 GNU 工具,这应该可以防止 Babyy 所说的误报:
find /directory -type f -mtime +5 -print | while read f; do
n=`basename "$f"`
d=`expr "X$n" : 'X.*\([0-9]\{4,\}-[0-9]\{2\}-[0-9]\{2,\}\)'` # (1)
test -n "$d" || continue # (2)
date -d "$d" >/dev/null 2>&1 && rm "$f" # (3)
done
评论:
- (1)将文件名的日期部分分配给
d
.它包括前导数字和尾随数字。如果没有日期部分,则将空字符串分配给d
。 - (2)
"$d"
如果是空字符串,将跳到下一次迭代。这是为了防止(3)删除文件,因为date -d
如果将空字符串作为其参数,则会成功。 (这似乎是 GNU 中的一个错误date
,但也许这种行为是有意为之。) - (3)
"$d"
如果包含有效日期,将删除该文件。请注意date -d
,如果日期的年份部分包含超过 4 位数字,只要月份和日期部分有效,该操作 就会成功。现在那是真正让您的代码面向未来!