shell rsync:将所有文件复制到具有不同名称的目标目录中

zy1mlcev  于 2023-04-21  发布在  Shell
关注(0)|答案(1)|浏览(102)

给定:源目录/mnt1/src,目标目录/mnt2/dest
问题:对于每日备份,我想将树中/mnt 1/src下的所有文件同步到/mnt 2/dest,例如/mnt1/src/foo/bar最终到/mnt2/dest/foo/bardest以下的文件,在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

这将完成这项工作,但它看起来不必要的复杂给我。有没有一种方法来实现我的目标,而不重命名目录之前和之后?

xienkqul

xienkqul1#

根据注解,rsync特别关注src操作数后面是否有一个尾随的'/''/'的存在或不存在分别控制是否传输 “contents-of”“directory-itself”。例如,在您的情况下,如果您提供尾随的斜杠,例如:

rsync --delete -ra /mnt1/src/ /mnt2/dest

/mnt1/src以下的所有内容都转移到/mnt2/dest
如果省略src后面的'/',则src目录本身(以及它下面的所有内容)将被传输,结果是/mnt2/dest/src/....(不是您想要的)
此外,您可以稍微调整一下选项。在-ra中,-r是重复的,因为-a意味着-rlptgoD。为了确保您只复制新的和更新的文件,请添加-u选项。--delete选项将删除dest中不存在于src中的文件。
总而言之,你可以完成你正在尝试的事情:

rsync -ua --delete /mnt1/src/ /mnt2/dest

如果你想看到传输的内容,添加-v以获得详细输出,或者我喜欢-i摘要输出。祝你的脚本好运。如果你有问题,请告诉我。

相关问题