Bash 脚本用于删除超过 30 天的文件夹,但省略第 1 天和第 15 天的文件夹

Bash 脚本用于删除超过 30 天的文件夹,但省略第 1 天和第 15 天的文件夹

我有一个用于存储数据库备份的挂载点,为了避免其增长到无法控制的程度,我打算只保留 30 天的备份,但也保留每 15 天创建的备份。因此,如果文件夹是在 1 日或 15 日创建的,那么当 30 天到期时,我希望它也能保留下来。

我目前使用它仅保留 30 天的备份,如何省略 1 日和 15 日创建的文件夹?

find /mnt/clusterfs01-data01/db01/* -type d -ctime +30 -exec rm -rf {} \;

文件夹名称的示例目录列表。

0 drwx------ 7 root root 324 Nov 11 01:35 2016-11-11_01-31-41
0 drwx------ 7 root root 250 Nov 11 06:25 2016-11-11_06-25-03

我不介意除此之外的其他解决方案find

答案1

要根据目录名称的日期时间字符串排除匹配项,您可以添加

! \( -name '????-15-??*' -o -name '????-30-??*' \)

或者

-not \( -name '????-15-??*' -o -name '????-30-??*' \)

执行find命令。

如果你真的想根据时间戳来判断,那么我能想到的唯一方法就是(笔记mtime在这里使用,因为您的touch命令似乎没有修改ctime我的系统:更改为%Td):%Cdctime

find dir -type d -mtime +30 -printf '%Td\t%p\0' | 
    while read -rd '' day dir; do 
      case "$day" in 
        15|30) ;; 
        *) echo rm -rf -- "$dir";; 
      esac
    done

答案2

尝试一下这个:

rm -rf $(find /mnt/clusterfs01-data01/db01/* -maxdepth 0 -type d -ctime +30 | grep -v "[0-9]\{4\}-01\|15-[0-9]\{2\}")

相关内容