如何rsync多个源文件夹

如何rsync多个源文件夹

我想同步多个源,我想知道实现这一目标的最佳方法。

例如

/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/fstabbkp/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/fstabbkp/home/user/download

最好的部分是(我相信从 rsync v.2.6.7 开始)我们可以本质上控制我们想要在目的地复制多少目录结构。 (请参阅有关选项
的文档--relative这里

例如,如果我们这样做

rsync -aR /home/./user1/download /home/./user2/download bkp

我们最终会得到bkp/user1/downloadbkp/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

相关内容