Rsync删除旧目录中的文件?

Rsync删除旧目录中的文件?

我真的陷入了 rsync 问题,并且无法通过阅读文档来解决它。我想创建 7 个目录,一周中的每一天一个,用于备份服务器上的一些文件夹和文件。我遇到的问题是 rsync 似乎正在删除前一天备份的目录。

例如...

/backup/Monday 将包含我移动的文件,但目录不包含 /backup/Tuesday/ 将包含文件和目录

我希望星期一目录包含星期一存在的所有文件,星期二目录包含星期二存在的所有文件。

这是我的脚本:

ssh [email protected] 'find /backup/staging/ -mtime +7 -exec rm -rf {} \;'
crontab -l > $(date +%Y%m%d).crontab
mysqldump -password cherry --all-databases> $(date +%Y%m%d)_cherrydb.sql
rsync -a --log-file=$(date +%Y%m%d).log /var/www/admin /var/www/customers /var/www/UploadedFiles /etc/apache2/certs /etc/apache2/sites-enabled $(date +%Y%m%d).crontab $(date +%Y%m%d)_cherrydb.sql [email protected]:/backup/staging/$(date +%A)/
rsync -a $(date +%Y%m%d).log [email protected]:/backup/staging/$(date +%A)/
rm $(date +%Y%m%d).log
rm $(date +%Y%m%d).crontab
rm $(date +%Y%m%d)_cherrydb.sql

答案1

我不确定,但我猜问题出在脚本的第一行。我认为您这样做的目的是删除前一周的备份,但这是一种危险的做法。两个替代选项是将第一行替换为

ssh [email protected] 'rm -rf /backup/staging/$(date +%A)/*'

或者删除脚本的第一行并使用--delete第一行上的标志rsync删除目标中不属于备份集的任何文件。

答案2

问题在于脚本的第一行和命令本身的组合rsync。让我们来看看...

find /backup/staging/ -mtime +7 -exec rm -rf {} \;命令删除所有文件和整个目录树其中文件或目录树的根至少 7 天没有被修改。

您还可以使用rsync -a ...,它可以跨文件和目录的修改时间进行复制。

最终结果是您find将匹配并删除至少 7 天前创建的文件和目录树。通常,这将包括系统文件,例如/bin/ls几乎可以肯定/它本身。您可以通过查看ls -ld /,确认显示的修改日期是在一周以上。

一种解决方案是使用rsnapshot,它可以很好地管理定时和日期备份。另一种可能是使用rsync -a ... --delete,但总的来说我建议使用rsnapshot

如果您确实想推出自己的解决方案,请考虑如下命令对:

find /backup/staging -mtime +7 \! -type d -delete
find /backup/staging -depth -type d -exec rmdir {} + 2>/dev/null

这将删除所有超过 7 天的非目录(即文件、设备节点等),然后删除所有空目录。

相关内容