我想同步多个源,我想知道实现这一目标的最佳方法。
例如
/etc/fstab
/home/user/download
我想到了 3 个解决方案:
- 解决方案1
多次调用 rsync
rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp
缺点:更难获得聚合统计数据
- 解决方案2
创建一个tobackup
包含符号链接的文件夹,并使用-L
选项
sync -aL /home/user/tobackup bkp
缺点:要备份的内容不得包含符号链接
- 解决方案3
将文件移动到备份并在原始位置创建符号链接
rsync -a /home/user/tobackup bkp
缺点:一些手动配置
您推荐哪一款?
有没有更好的办法 ?
答案1
您可以传递多个源参数。
rsync -a /etc/fstab /home/user/download bkp
这会创建bkp/fstab
和bkp/download
,就像您给出的单独命令一样。相反,可能需要保留源结构。为此,请使用/
作为源并使用包含-排除规则指定要复制的文件。有两种方法可以做到这一点:
当您想要复制整个目录树时,显式包含每个文件以及通向该文件的每个目录组件,并
/***
在目录末尾添加:rsync -a \ --include=/etc --include=/etc/fstab \ --include=/home --include=/home/user --include='/home/user/download/***' \ --exclude='*' / bkp
/*/
使用(以便 rsync 在查找要复制的文件时遍历/etc
)包含所有顶级目录,使用(for )/home
包含所有二级目录,但删除不复制任何文件的目录。这更方便,因为您不必明确列出父母。您甚至可以使用而不是计算级别数,但这在这里是不切实际的,因为 rsync 会遍历整个文件系统来探索目录,即使没有一个包含规则可以匹配和之外的任何内容。/*/*/
/home/user
--prune-empty-dirs --include='*/'
/etc
/home/user/download
rsync -a --prune-empty-dirs \ --include='/*/' --include='/*/*/' \ --include=/etc/fstab \ --include='/home/user/download/***' \ --exclude='*' / bkp
答案2
我真的很喜欢吉尔斯的回答,但是,我想补充一点,在我看来,通过与该--relative
选项结合传递多个源参数,可以最好地满足在保留目录结构的同时同步多个文件夹的要求。
在这种情况下,我们可以有如下内容:
rsync -aR /etc/fstab /home/user/download bkp
这将导致bkp/etc/fstab
和bkp/home/user/download
。
最好的部分是(我相信从 rsync v.2.6.7 开始)我们可以本质上控制我们想要在目的地复制多少目录结构。 (请参阅有关选项
的文档--relative
这里)
例如,如果我们这样做
rsync -aR /home/./user1/download /home/./user2/download bkp
我们最终会得到bkp/user1/download
和bkp/user2/download
。
答案3
这也有效 - 大括号,包含逗号分隔的源列表。
rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive
与您使用 cp 和某些其他实用程序调用大括号 sytnax 时发生的情况有些相似:
cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive