![Bash 脚本用于删除超过 30 天的文件夹,但省略第 1 天和第 15 天的文件夹](https://linux22.com/image/1142365/Bash%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E5%88%A0%E9%99%A4%E8%B6%85%E8%BF%87%2030%20%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%8C%E4%BD%86%E7%9C%81%E7%95%A5%E7%AC%AC%201%20%E5%A4%A9%E5%92%8C%E7%AC%AC%2015%20%E5%A4%A9%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我有一个用于存储数据库备份的挂载点,为了避免其增长到无法控制的程度,我打算只保留 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
):%Cd
ctime
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\}")