我需要每天在此服务器上备份数据和配置文件。我需要保留:
- 一周的每日备份
- 一个月的每周备份
- 一年的每月备份
- 之后的年度备份
所有这些都是通过每天从 cron 运行的 shell 脚本完成的。
这是运行 10 年后备份文件的外观:
blog-20050103.tar.bz2
blog-20060102.tar.bz2
blog-20070101.tar.bz2
blog-20080107.tar.bz2
blog-20090105.tar.bz2
blog-20100104.tar.bz2
blog-20110103.tar.bz2
blog-20120102.tar.bz2
blog-20130107.tar.bz2
blog-20130902.tar.bz2
blog-20131007.tar.bz2
blog-20131104.tar.bz2
blog-20131202.tar.bz2
blog-20140106.tar.bz2
blog-20140203.tar.bz2
blog-20140303.tar.bz2
blog-20140407.tar.bz2
blog-20140505.tar.bz2
blog-20140602.tar.bz2
blog-20140707.tar.bz2
blog-20140728.tar.bz2
blog-20140804.tar.bz2
blog-20140811.tar.bz2
blog-20140816.tar.bz2
blog-20140817.tar.bz2
blog-20140818.tar.bz2
blog-20140819.tar.bz2
blog-20140820.tar.bz2
blog-20140821.tar.bz2
blog-20140822.tar.bz2
你严重过度设计了这个。很糟糕。
这是一些伪代码:
daily
目录daily
备份之外的所有内容weekly
目录weekly
备份之外的所有内容monthly
目录monthly
备份之外的所有内容yearly
目录您必须实现的逻辑量大致相同,是吗?吻。
这看起来更容易:
或者,按文件计数而不是年龄:
例如,如果您只想保留 8 次每日备份和 5 次每周(每个星期日)备份,它的工作方式如下:
截至今天(2014-11-10),这将输出:
作为留给您的练习,您只需删除名称未出现在
keep
-array 中的所有备份文件。如果您还想保留 13 个每月备份(每个月的第一个星期日)和 6 个年度备份(每年的第一个星期日),事情会变得有点复杂:
截至今天(2014-11-10),这将输出:
同上,只需删除该数组中未找到的所有备份文件即可。
我最近遇到了同样的问题。恕我直言,尝试编写一个 shell 脚本来做这件事是很痛苦的,而且使用带有内置函数(如集合、字典等)的高级语言编写一些可重用的逻辑要容易得多。一般的想法是采用配置来指示有多少文件您要保留的每个时期,然后决定是否应保留每个文件。
有一个相当流行的基于 python 的脚本,它看起来非常漂亮,并且有一些易于理解的源代码。再加上基于 python 而不是基于 shell 赋予了它跨平台的优势: https ://github.com/xolox/python-rotate-backups
正如评论中提到的,通常最好将管理备份的任务委托给备份管理软件。
但这是 bash 中根据您的要求删除旧备份的逻辑
显示运行 3520 天后哪些文件将保留的 PHP 代码
https://ideone.com/n2ymQy
我也遇到过同样的问题。基本上需要运行每日完整备份的文件系统上的空间。
我写了一个只打印 rm -f 命令的脚本。
基本但对我来说已经足够了。易于适应/改进。
好处:
限制:
脚本输出示例: