我真的陷入了 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 天的非目录(即文件、设备节点等),然后删除所有空目录。