如何同步多个源文件夹

use*_*346 60 rsync

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

例如

/etc/fstab
/home/user/download
Run Code Online (Sandbox Code Playgroud)

我想到了 3 个解决方案:

  • 解决方案1

多次调用 rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp
Run Code Online (Sandbox Code Playgroud)

骗局:更难汇总统计数据

  • 解决方案2

创建一个tobackup包含符号链接的文件夹,并使用-L选项

sync -aL /home/user/tobackup bkp
Run Code Online (Sandbox Code Playgroud)

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

  • 解决方案3

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

rsync -a /home/user/tobackup bkp
Run Code Online (Sandbox Code Playgroud)

con :一些手动配置

你推荐哪一个?

有没有更好的办法 ?

Gil*_*il' 62

您可以传递多个源参数。

rsync -a /etc/fstab /home/user/download bkp
Run Code Online (Sandbox Code Playgroud)

这会创建bkp/fstabbkp/download,就像您提供的单独命令一样。可能需要保留源结构。为此,请使用/作为源并使用包含-排除规则来指定要复制的文件。有两种方法可以做到这一点:

  • 显式包含每个文件以及导致它的每个目录组件,/***当您要复制整个目录树时,在目录的末尾:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
    Run Code Online (Sandbox Code Playgroud)
  • 包括所有顶级目录/*/(以便 rsync 将遍历/etc/home在查找要复制的文件时) 和二级目录/*/*/(for /home/user),但删除没有复制文件的目录。这更方便,因为您不必明确列出父母。你甚至可以使用--prune-empty-dirs --include='*/'代替数数级别数,但这是不切实际这里rsync的会遍历整个文件系统探索的目录,即使没有任何的规则,包括可以匹配任何外界/etc/home/user/download

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    
    Run Code Online (Sandbox Code Playgroud)


小智 30

我真的很喜欢 Gilles 的回答,但是,我想补充一点,在我看来,最好通过将多个源参数与--relative选项一起传递来满足同步多个文件夹同时保留目录结构的要求。

在这种情况下,我们可以有以下内容:

rsync -aR /etc/fstab /home/user/download bkp
Run Code Online (Sandbox Code Playgroud)

这将导致bkp/etc/fstabbkp/home/user/download

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

所以例如如果我们这样做

rsync -aR /home/./user1/download /home/./user2/download bkp
Run Code Online (Sandbox Code Playgroud)

我们最终会得到bkp/user1/downloadand bkp/user2/download


Bra*_*ein 11

这也有效 - 花括号,包含逗号分隔的来源列表。

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive
Run Code Online (Sandbox Code Playgroud)

有点类似于使用 cp 和某些其他实用程序调用花括号 sytnax 时发生的情况:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
Run Code Online (Sandbox Code Playgroud)

  • 这是 shell 功能,不保证有效。更多信息请参见:https://unix.stackexchange.com/questions/409065/how-does-curly-brace-expansion-work-in-the-shell (4认同)