给定:源目录/mnt1/src
,目标目录/mnt2/dest
。
问题:对于每日备份,我想将树中/mnt 1/src下的所有文件同步到/mnt 2/dest,例如/mnt1/src/foo/bar
最终到/mnt2/dest/foo/bar
。dest
以下的文件,在src
下没有对应的条目,应该从dest
中删除。
环境:zsh
我尽力了
rsync --delete -ra /mnt1/src/*(D) /mnt2/dest
这几乎是可行的,但是有一个问题,例如,如果我在dest
中有一个无关的文件dummy
,它是由
touch /mnt2/dest/dummy
,这个文件不会被删除,因为globbing(src/*(D)
)不包含这个文件,因此rsync会忽略它。
我当然可以
rsync --delete -ra /mnt1/src /mnt2/dest
这将删除这些额外的文件,但文件/mnt1/src/foo/bar
将以/mnt2/dest/src/foo/bar
结束,这也是我不希望的。
我可以
mv /mnt2/dest /mnt2/src
rsync --delete -ra /mnt1/src /mnt2
mv /mnt2/src /mnt2/dest
这将完成这项工作,但它看起来不必要的复杂给我。有没有一种方法来实现我的目标,而不重命名目录之前和之后?
1条答案
按热度按时间xienkqul1#
根据注解,
rsync
特别关注src
操作数后面是否有一个尾随的'/'
。'/'
的存在或不存在分别控制是否传输 “contents-of” 或 “directory-itself”。例如,在您的情况下,如果您提供尾随的斜杠,例如:/mnt1/src
以下的所有内容都转移到/mnt2/dest
。如果省略
src
后面的'/'
,则src
目录本身(以及它下面的所有内容)将被传输,结果是/mnt2/dest/src/....
(不是您想要的)此外,您可以稍微调整一下选项。在
-ra
中,-r
是重复的,因为-a
意味着-rlptgoD
。为了确保您只复制新的和更新的文件,请添加-u
选项。--delete
选项将删除dest
中不存在于src
中的文件。总而言之,你可以完成你正在尝试的事情:
如果你想看到传输的内容,添加
-v
以获得详细输出,或者我喜欢-i
摘要输出。祝你的脚本好运。如果你有问题,请告诉我。