如何同步多个源文件夹


34

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

例如

/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

con:要备份的内容不得包含符号链接

  • 解决方案3

将文件移至备份并在原始位置创建符号链接

rsync -a /home/user/tobackup bkp

con:一些手动配置

您推荐哪一个?

有没有更好的办法 ?


Answers:


33

您可以传递多个源参数。

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/home在寻找要复制的文件时)和第二级目录包括/*/*/(对/home/user),但删除其中没有文件被复制的目录。这更加方便,因为您不必明确列出父母。您甚至可以使用--prune-empty-dirs --include='*/'而不是计算级别数,但这在这里是不切实际的,因为rsync会遍历整个文件系统以浏览目录,即使include规则都不能匹配/etc和之外的任何内容/home/user/download

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

1
很好,但是如何在bkp中保留目录结构?
罗德里戈

我是说,bkp / etc / fstab和bkp / home / user / dowlonad?还是/ bkp / fstab和bkp / download?
罗德里戈

@Rodrigo我已经编辑了我的答案
Gilles'所以

13

我非常喜欢Gilles的回答,但是,我想补充一点,在我看来,通过同时传递多个源参数和该--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


2

这也适用-大括号,包含用逗号分隔的源列表。

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

您将如何以此指定ssh端口?该语法在使用时似乎确实有效-e
tcurdt,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.