如何按设置为日期的文件名删除文件?

如何按设置为日期的文件名删除文件?

我想删除文件不是按访问日期或创建日期,而是按文件名。文件名将是日期,我希望每周运行一次 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 天前的日期,依此类推。

我希望你能理解我。如果您需要什么,请发表评论。

相关内容