我想 rsync 多个源,我想知道实现这一目标的最佳方法。
例如
/etc/fstab
/home/user/download
Run Code Online (Sandbox Code Playgroud)
我想到了 3 个解决方案:
多次调用 rsync
rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp
Run Code Online (Sandbox Code Playgroud)
骗局:更难汇总统计数据
创建一个tobackup
包含符号链接的文件夹,并使用-L
选项
sync -aL /home/user/tobackup bkp
Run Code Online (Sandbox Code Playgroud)
con :要备份的内容不得包含符号链接
将文件移动到备份中并在原始位置创建符号链接
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/fstab
和bkp/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/fstab
和bkp/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/download
and 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)