删除文件名日期早于 7 天的文件

删除文件名日期早于 7 天的文件

所以我的备份服务器上的所有文件都命名为 archive-2021-03-18.zip、archive-2021-03-19.zip 等。我想设置一个 cronjob 来删除名称早于 7 天的文件。

有人可以帮助我吗?

答案1

zsh

#! /bin/zsh -
zmodload zsh/datetime || exit

cd /path/to/backups || exit

strftime -s oldest_to_keep archive-%F.zip $(( EPOCHSECONDS - 7 * 24*60*60 ))

rm -f archive-<->-<1-12>-<1-31>.zip(Ne['[[ $REPLY < $oldest_to_keep ]]'])

答案2

也许这可以做得更优雅,但我只是一个简单的人。此外,此脚本还会偶然发现包含新行的文件名(我一生中从未遇到过):

$ cat archive_cleaner.sh
#!  /bin/bash

age="7 days ago"

find . -iname 'archive*zip' | while read name; do
        bname=`basename "$name"`
        bdate=`echo "$bname" | sed 's/archive-//;s/.zip//'`
        agemax=`date -d "$age" +%s`   || exit 1
        agesrc=`date -d "$bdate" +%s` || exit 2
        if [ $agesrc -lt $agemax ]; then
                echo /bin/rm -v "$name"
        fi
done

$ pwd
/tmp/test

$ find . -type f
./1/2/3/archive-2021-04-08.zip
./1/2/3/archive-2021-04-07.zip
./1/2/3/archive-2021-04-10.zip
./1/2/3/archive-2021-04-14.zip
./1/2/3/archive-2021-03-19.zip
./1/2/3/archive-2021-03-18.zip

$ archive_cleaner.sh
/bin/rm -v ./1/2/3/archive-2021-04-08.zip
/bin/rm -v ./1/2/3/archive-2021-04-07.zip
/bin/rm -v ./1/2/3/archive-2021-03-19.zip
/bin/rm -v ./1/2/3/archive-2021-03-18.zip

删除第 11 行中的“echo”以实际删除文件。

答案3

请检查find命令。虽然我在这里使用实际的文件日期,但该命令在要搜索的文件列表中具有正则表达式支持,并且应该能够执行您想要执行的操作。

# Find and delete files in the Daily tree more than four days old
# (rounding error means 4.23:59:59 is four days, so keep between three and five dailies)
find /dbdata/daily -mtime +3 -delete

编辑:虽然可以通过名称来完成此操作,但也困难得多。我们必须创建一个脚本循环,以(例如)想要的格式生成一个字符串来表示今天的日期和前 7 天,find然后将其传递给find开关,-not -regex以便它找到除您想要的文件之外的所有内容保持。

相关内容