rsync通过比较大小和mtime来检测文件修改。 但是,如果由于某种原因,mtime不变,rsync将无法检测到这一变化,尽pipe可以通过查看ctime来发现它。
当然,我可以告诉rsync比较整个文件的内容,但这非常昂贵。
有没有办法使rsync更聪明,例如通过检查mtime +大小是否相同,并且ctime不比mtime(源和目标)都新? 或者我应该打开一个function请求?
这是一个例子:
创build2个文件,相同的内容和时间/时间
benoit@debian:~$ mkdir d1 && cd d1 benoit@debian:~/d1$ echo Hello > a benoit@debian:~/d1$ cp -aab
将它们同步到另一个(不存在的)目录:
benoit@debian:~/d1$ cd .. benoit@debian:~$ rsync -av d1/ d2 sending incremental file list created directory d2 ./ a b sent 164 bytes received 53 bytes 434.00 bytes/sec total size is 12 speedup is 0.06
好的,一切都是同步的
benoit@debian:~$ grep . d*/* d1/a:Hello d1/b:Hello d2/a:Hello d2/b:Hello
更新文件'b',大小相同,然后重新设置atime / mtime
benoit@debian:~$ echo World > d1/b benoit@debian:~$ touch -r d1/a d1/b
尝试再次rsync:
benoit@debian:~$ rsync -av d1/ d2 sending incremental file list sent 63 bytes received 12 bytes 150.00 bytes/sec total size is 12 speedup is 0.16
不,rsync错过了这个变化。
benoit@debian:~$ grep . d*/* d1/a:Hello d1/b:World d2/a:Hello d2/b:Hello
告诉rsync比较文件的内容
benoit@debian:~$ rsync -acv d1/ d2 sending incremental file list b sent 144 bytes received 31 bytes 350.00 bytes/sec total size is 12 speedup is 0.07
给出正确的结果:
benoit@debian:~$ grep . d*/* d1/a:Hello d1/b:World d2/a:Hello d2/b:World
chmod和其他改变文件属性但不改变内容的命令会更新ctime。
也就是说,修改文件的内容将改变其时间。 所以除非有人回头把mtime重新设置为早先的值,否则校验和不会告诉你任何比较mtimes的东西都不会。
请注意,每次更改都会更新ctime。 你不能重写,你不能手动修改ctime。 这意味着-t选项对ctime没有影响。
我猜测,rsync的作者认为,由于这个原因,比较ctimes不会很有用。
恕我直言,他们错了。 首先,你可能希望rsync更新一个文件,如果它的属性被改变了。 其次,Windows文件系统没有mtime,所以使用挂载的Windows文件系统时,比较ctimes的能力将会非常有用。 按照现状,从Windows文件系统进行同步时,必须使用校验和选项。