我想删除文件不是按访问日期或创建日期,而是按文件名。文件名将是日期,我希望每周运行一次 cronjob,以清除超过 7 天的文件名日期。我可以做一个
find /my/directory -type f -name '*file-name.yyyy-mm-dd.qz' -delete
但我必须每周更改脚本才能运行。我想避免每周都要修改工作。
答案1
这是一种更强大的形式,可以正确处理文件名和目录名中的空格(甚至换行符)。
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
{} \;
答案2
我无法发表评论,但这是创建空测试文件的命令:
for i in {0..50};do touch blah.`date "+%Y-%m-%d" -d "$i days ago"`.qz ;done
我相信戴夫的回答能起到作用。 (我需要用“; do”来完成 for 命令)
一个很棒的 cron 衬垫。
答案3
我会推荐一个简短的脚本,基本上获取所有具有类似日期格式的文件名,然后循环遍历它们,检查 7 天前是否晚于文件名中找到的日期,如果是,则将其删除。
日期解析基本上以 YYYYMMDD 格式生成一个整数,并使用它进行比较,这应该可以正常工作,因为较大的单位具有更高的十倍数。
这是我脑子里想出来的一个粗略的脚本,我没有机会测试。
for file in $(find /my/directory -type f -name "*file-name.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].qz")
if [ $(date -d '7 days ago' +"%Y%m%d") -ge $(date -d $(echo $(basename $file) | cut -d '.' -f 2) +"%Y%m%d") ]; then
rm $file
fi
done
答案4
你可以使用这个:
find /my/directory -type f -name "*file-name.$(date -d '7 days ago' +%Y-%m-%d).qz" -delete
这让 shell 告诉我们 7 天前的日期是哪一天:$(date -d '7 days ago' +%Y-%m-%d)
例如:如果今天是2016-06-06
这样:2016-05-30
因此,无论何时执行命令,都会采用 7 天前的日期,依此类推。
我希望你能理解我。如果您需要什么,请发表评论。