![rsync 多个源和目标](https://linux22.com/image/223048/rsync%20%E5%A4%9A%E4%B8%AA%E6%BA%90%E5%92%8C%E7%9B%AE%E6%A0%87.png)
以下按预期工作:
rsync --delete-after -uavh --progress /home/usr/test1/cool-beans /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/pineapple /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/pizza /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/dragons /home/usr/test2/elephant/
然而,当我将其简化为:
rsync --delete-after -uavh --progress \
/home/usr/test1/cool-beans /home/usr/test2/ \
/home/usr/test1/pineapple /home/usr/test2/ \
/home/usr/test1/pizza /home/usr/test2/ \
/home/usr/test1/dragons /home/usr/test2/elephant/
我收到一个错误。它不是根据需要仅将文件夹“dragons”放入“elephant”中,而是将所有“cool-beans”、“pineapple”、“pizza”和“dragons”放入“elephant”中,这是不希望的。如何以简化的方式编写它(没有第一个示例的重复),同时实现相同的输出?谢谢!
答案1
您不能在单个rsync
命令中包含多个目标。当您尝试“简化”版本时发生的情况是,除了最后一个路径之外的所有路径都被视为复制数据的源,因此您不仅从cool-beans
、pineapple
、pizza
以及dragons
自身复制test2
(重复)。--dry-run
当第一次尝试某些东西时,这个选项非常有用。
您的通话可以简化为两次通话。要么完整:
rsync --delete-after -uavh --progress /home/usr/test1/cool-beans /home/usr/test1/pineapple /home/usr/test1/pizza /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/dragons /home/usr/test2/elephant/
或者使用函数来封装公共元素:
myRsync1() {
rsync --delete-after -uavh --progress "$@"
}
myRsync1 /home/usr/test1/cool-beans /home/usr/test1/pineapple /home/usr/test1/pizza /home/usr/test2/
myRsync1 /home/usr/test1/dragons /home/usr/test2/elephant/
如果您可以保证大多数路径以固定组件开头,您可以通过提供公共路径(必须已经存在)作为第一个参数来进一步简化函数调用的可见使用:
myRsync2() (
cd -- "$1" || return 1
shift
rsync --delete-after -uavh --progress "$@"
)
然后调用:
myRsync2 /home/usr/test1 cool-beans pineapple pizza /home/usr/test2/
myRsync2 /home/usr/test1/dragons /home/usr/test2/elephant
或者:
myRsync2 /home/usr test1/cool-beans test1/pineapple test1/pizza test2/
myRsync2 /home/usr test1/dragons test2/elephant
答案2
你不能。rsync
可以接受多个源,但只能接受一个目的地。 rsync 必须调用多次。
但是,您可以将相同的 rsync 和选项部分放入变量中并调用它:
rsync_call="rsync --delete-after -uvah --progress"
$rsync_call /source/one/ /destination/one/
$rsync_call /source/two/ /destination/two/