Назад | Перейти на главную страницу

Как заставить rsync также проверять ctime?

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.