rsync 通过比较文件大小和修改时间检测文件修改。但是,如果由于某种原因,修改时间没有改变,rsync 将无法检测到这种变化,尽管可以通过查看 ctime 来发现它。
当然,我可以告诉 rsync 比较整个文件的内容,但这非常非常昂贵。
有没有办法让 rsync 更智能,例如通过检查 mtime+size 是否相同,以及 ctime 是否不比 mtime 新(在源和目标上)?或者我应该打开功能请求?
以下是一个例子:
创建 2 个文件,内容相同,atime/mtime
benoit@debian:~$ mkdir d1 && cd d1
benoit@debian:~/d1$ echo Hello > a
benoit@debian:~/d1$ cp -a a b
将它们 Rsync 到另一个(不存在的)目录:
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
答案1
chmod 和其他改变文件属性但不改变其内容的命令将更新 ctime。
也就是说,修改文件的内容将改变其修改时间。因此,除非有人返回并将修改时间重置为先前的值,否则校验和不会告诉您比较修改时间所无法告诉的任何信息。
请注意,每次更改后 ctime 都会更新。您无法覆盖它,也无法手动修改 ctime。这意味着 -t 选项对 ctime 没有影响。
我猜测 rsync 的作者认为由于这个原因,比较 ctimes 不会很有用。
恕我直言,他们错了。首先,如果文件的属性发生变化,您可能希望 rsync 更新文件。其次,Windows 文件系统没有 mtime,因此在使用已挂载的 Windows 文件系统时,比较 ctime 的能力将非常有用。就目前情况而言,从 Windows 文件系统同步时,您必须使用校验和选项。