目录SRC是否以斜杠结尾,会影响同步的结果:
我们经常这样使用rsync:
但rsync不会同步文件的 modify time ,凡是有数据同步的文件,目的端的文件的 modify time 总是会被修改为最新时刻的时间。
rsync不会太关注目的端文件的 rwx 权限,如果目的端没有此文件,那么权限会保持与源端一致;如果目的端有此文件,则权限不会随着源端变更。
只要rsync有对源文件的读权限,且对目标路径有写权限,rsync就能确保目的端文件同步到和源端一致。
rsync只能以登陆目的端的账号来创建文件,它没有能力保持目的端文件的输主和属组和源端一致。除非你使用 root 权限,才有资格要求属主一致、属组一致。
带有-t选项的rsync,会变得更聪明些,它会在同步前先对比两边文件的时间戳和文件大小,如果一致,则就认为两边文件一样,对此文件就不再采取更新动作了。
因为rsync的聪明,也会反被聪明误。如果目的端的文件的时间戳、大小和源端完全一致,但是内容恰巧不一致时,rsync是发现不了的。这就是传说中的“坑”!
对于rsync自作聪明的情况,解决办法就是使用-I选项。
-I选项可以确保数据的一致性,代价便是速度上会变慢,因为我们放弃了 quick check 策略。 quick check 策略,就是先查看文件的时间戳和文件大小,依次先排除一批认为相同的文件。
无论情况如何,目的端的文件的 modify time 总会被更新到当前时刻。
一般情况下,-z的压缩算法会和 gzip 的一样。
所以,如果你真的想同步文件夹,那就要加上-r选项,即 recursive(递归的、循环的),像这样:
那么,提个问题:“因为在Linux的世界里,文件夹也是文件,如果这类文件(文件夹)也只有内容不同,而时间戳和文件大小都相同,rsync会发现么?”
实验大家可以自己动手做,结论在这里告诉大家:
对于文件夹,rsync是会明察秋毫的,只要你加了-r选项,它就会恪尽职守的进入到文件夹里去检查,而不会只对文件夹本身做 quick check 的。
如果我偏偏就想让rsync采取 follow link 的方式,那就用-L选项就可以了。你可以自己试试效果。
如果你不使用此选项的话,rsync是这样来处理权限问题的:
-a选项的学名应该叫做 archive option,中文叫做归档选项。使用-a选项,就表明你希望采取递归方式来同步,且尽可能的保持各个方面的一致性。
但是-a选项也有阿克琉斯之踵,那就是-a无法同步“硬链接”情况。如果有这方面需求,要加上-H选项。
-delete选项必须和-r选项搭配使用。
-delete-excluded选项必须和-r选项搭配使用。
-delete-after选项必须和-r选项搭配使用。
This option can be dangerous if used incorrectly!
如果你要隐藏的隐私太多的话,在命令行选项中设置会比较麻烦,rsync还是很体贴,它提供了-exclude-from选项,让你可以把隐私一一列在一个文件里,然后让rsync直接读取这个文件就好了。
-include选项可以被多次使用。-include-from选项用于指定文件中读取文件列表。
请注意 exclude 和 include 的先后顺序。先 exclude 再 include。
我们在使用中,经常会看到有人会使用-P选项,这个选项其实是为了偷懒而设计的。以前人们总是要手动写-partial -progress,觉得太费劲了,倒不如用一个新的选项来代替,于是-P应运而生了。有些读者会问-partial我知道作用了,可-progress是干什么用的呢?为什么很多人要使用它呢,它有那么大的吸引力?
真有……
PS:后续会讲解有关rsync的-exclude的 PATTERN 语法。
谢谢!
转载:
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176882.html原文链接:https://javaforall.net
