rsync detects files modification by comparing size and mtime.
However, if for any reason, the mtime is unchanged, rsync won't detect the change, although it's possible to spot it by looking at the ctime.
Of course, I can tell rsync do compare the whole files' contents, but that's very very expensive.
Is there a way to make rsync smarter, for example by checking mtime+size are the same AND that ctime isn't newer than mtime (on both source and destination) ? Or should I open a feature request ?
Here's an example:
Create 2 files, same content and atime/mtime
benoit@debian:~$ mkdir d1 && cd d1
benoit@debian:~/d1$ echo Hello > a
benoit@debian:~/d1$ cp -a a b
Rsync them to another (non-exisiting) directory:
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
OK, everything is synced
benoit@debian:~$ grep . d*/*
d1/a:Hello
d1/b:Hello
d2/a:Hello
d2/b:Hello
Update file 'b', same size and then reset its atime/mtime
benoit@debian:~$ echo World > d1/b
benoit@debian:~$ touch -r d1/a d1/b
Attempt to rsync again:
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
Nope, rsync missed the change.
benoit@debian:~$ grep . d*/*
d1/a:Hello
d1/b:World
d2/a:Hello
d2/b:Hello
Tell rsync the compare the file content
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
Gives the correct result:
benoit@debian:~$ grep . d*/*
d1/a:Hello
d1/b:World
d2/a:Hello
d2/b:World