我想删除文件不是按日期访问或创建,而是按文件名。文件名将是日期,我想每周执行一次cronjob,以清除7天以上的文件名日期。我可以做一个
find /my/directory -type f -name '*file-name.yyyy-mm-dd.qz' -delete
但是我必须每周更改脚本才能运行。我希望避免每周都要修改作业。
这是一种更健壮的形式,可以正确处理文件名和目录名称中的空格(甚至换行符)。
find . -type f -name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz' -exec sh -c 'fdate="${1%.qz}"; fdate="${fdate##*.}"; [ "$fdate" "<" "$(date +%F -d "7 days ago")" ] && rm "$1"' find-sh {} \;
这涉及许多可能对某些人来说有些陌生的shell欺骗,所以让我们分解一下:
从当前目录开始,递归查找所有常规文件...
find . -type f
...其名称以完全相同的模式“ .YYYY-MM-DD.qz”结尾...
-name '*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz'
...然后,在每个匹配文件上运行一个shell命令(注意单引号)...
-exec sh -c '
...首先去除结尾的“ .qz” ...
fdate="${1%.qz}";
...然后去除开头的多余部分,仅保留“ YYYY-MM-DD” ...
fdate="${fdate##*.}";
...并比较该字符串以查看其排序方式(词法)是否早于7天前的日期“ YYYY-MM-DD” ...
[ "$fdate" "<" "$(date +%F -d "7 days ago")" ]
...如果是,则删除文件...
&& rm "$1"'
...我们将使用“ find-sh”作为“脚本名称”(即$0
)用于错误报告...
find-sh
...并将找到的文件名设置为内嵌shell脚本的find
参数一($1
)。
{} \;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句