我如何让 rsync 也检查 ctime?

我如何让 rsync 也检查 ctime?

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 文件系统同步时,您必须使用校验和选项。

相关内容