如何使用rsync备份最近变更的文件?

17

有没有可能指定一个时间范围,使得rsync仅在最近更改的文件上操作。

我正在编写一个脚本,在SSH上备份最近添加的文件,rsync似乎是一个高效的解决方案。我的问题是,我的源目录包含大量旧文件,我对它们不感兴趣,也不想备份。

到目前为止,我遇到的唯一解决方案是使用ctime查找生成--files-from文件。这种方法可以解决问题,但我必须处理一些旧版本rsync不支持--files-from的安装。我正在考虑以同样的方式生成--include-from模式,但希望找到更优雅的解决方案。


当您完成了初始的rsync之后,下一次调用它时,它只会传输新的或已修改的文件。这就是rsync的目的。 - lothar
另一个选择是重新组织您的目录布局,使您不想备份的文件位于不同的路径中,这样您就可以将该路径放入rsync的忽略列表中。 - lothar
我本来想建议使用rsync的“-t”选项,但那并不完全符合要求。 - Hasturkun
谢谢Lothar - 但我的问题是有大量历史文件我不感兴趣(但不能删除,因为可能对其他人有用)。我希望有一个解决方案,让我完全忽略旧材料。 - Ken
@lothar - 我无法删除或重新排列历史资料。 - Ken
@Ken 今天的磁盘空间很便宜。一旦你完成了初始备份(包括历史文件),rsync 就再也不会触及它们了。排除它们可能并不值得麻烦。只是我的两分钱;-) - lothar
4个回答

26

看起来你可以在rsync的参数中指定shell命令(参见Remote rsync executes arbitrary shell commands)。

因此,我已经成功地通过使用以下方式限制rsync查看的文件:

rsync -av remote_host:'$(find logs -type f -ctime -1)' local_dir

该命令查找在最近一天内更改的所有文件(-ctime -1),然后将这些文件同步到local_dir。

我不确定这个功能是否是按设计来的,但我仍在深入研究文档。


只是想简单说一下,这对我正在使用的数据导入脚本非常有用。谢谢! - Matthew
1
注意这个问题:如果有很多匹配的文件,嵌入式查找的结果可能会超出shell的命令行长度限制。这在我身上发生过。 - GaryO
这不会保留目录结构。 - carlosvini

2
为什么不直接备份整个目录并利用rsync、rdiff等工具提供的增量备份功能,这样可以避免在备份时浪费磁盘空间,因为文件只有在发生更改时才会被备份。
备份整个目录更简单,并且存在的错误风险要小得多。试图选择性地备份某些文件而排除其他文件只会导致无法备份所需文件,然后在无法恢复关键文件时遇到麻烦。
否则,应重新组织源目录,以减少备份脚本中的“决策”。

我通常会同意关于错误风险的观点,但我永远不会使用旧文件(日志和其他永远不会更改的记录)。我只是会承受一些压力,但是想到必须下载并定期重新处理几个不需要的庞大文件,这就是我首先提出这个问题的原因。重新组织可能是解决方案 - 我无法更改现有结构,但我可以像Hasturkun建议的那样设置一个临时目录。 - Ken
对我来说,我想要从远程传输到本地,处理文件,然后删除旧的文件(mtime +30)以节省空间。天真的rsync会在下一次重新下载旧文件,因为它们现在在本地已经不存在了。 - GaryO

1
创建一个临时目录,将文件进行符号链接或硬链接,然后进行rsync同步,这个方案怎么样?

1

我可以建议您放弃使用rsync,转而考虑使用rdiff-backup吗?


谢谢,我会看一下的 - 我之前看过,但是CIFS兼容性问题让我却步了。(http://rdiff-backup.nongnu.org/FAQ.html#cifs) - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接