rsync обнаруживает модификацию файлов, сравнивая размер и время. Однако, если по какой-либо причине mtime не изменилось, 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
chmod и другие команды, которые изменяют атрибуты файла, но не его содержимое, обновят ctime.
Тем не менее, изменение содержимого файла изменит его mtime. Так что, если кто-то не вернулся и не сбросил mtime до его более раннего значения, контрольная сумма не скажет вам ничего, чего не скажет сравнение mtime.
Обратите внимание, что ctime обновляется при каждом изменении. Вы не можете переопределить это, и вы не можете вручную изменить ctime. Это означает, что опция -t не влияет на ctime.
Я предполагаю, что авторы rsync посчитали, что по этой причине сравнение ctimes не будет очень полезным.
ИМХО, они ошибаются. Во-первых, вы можете захотеть, чтобы rsync обновлял файл, если его атрибуты были изменены. Во-вторых, файловые системы Windows не имеют mtime, поэтому возможность сравнения ctimes будет очень полезна при работе с смонтированными файловыми системами Windows. В его нынешнем виде вы должны использовать опцию контрольной суммы при синхронизации из файловой системы Windows.