Может ли rsync проверять содержимое перед синхронизацией

Может ли Rsync быть настроен для проверки содержимого файла перед его синхронизацией. Я слышал о контрольной сумме, но я узнал, что контрольная сумма только делает выборку. Я хочу передать файл только в том случае, если это содержимое изменяется, а не timestamp, есть ли способ сделать это с любым из режимов rsync. В моем сценарии, скажем, файл sample.text будет создан каждую неделю, и я хочу синхронизировать его с удаленным сервером, только если содержимое sample.text будет изменено, так как оно создается каждую неделю, метка времени, очевидно, изменится. Но я хочу передачу только при изменении контента.

Ответ 1

Да:

$ man rsync | grep "\--checksum"
    -c, --checksum              skip based on checksum, not mod-time & size

Rsync довольно сложный. Я рекомендую обойтись со справочной страницей и поэкспериментировать с тестовыми данными, прежде чем использовать их для чего-либо удаленно важного.

В большинстве случаев люди используют rsync -ac source dest.

$ man rsync | grep "\--archive"
 -a, --archive               archive mode; same as -rlptgoD (no -H)

И что мусор -rlptgoD означает: рекурсивное (r), копирование символических ссылок как символических ссылок (l), сохранение разрешений (p), сохранение времен (t), сохранение группы (g), сохранение владельца (o), сохранение файлов устройств (D, только для суперпользователя), сохраняйте специальные файлы (также часть D).

-c или --checksum действительно то, что вы ищете (пропустите на основе контрольной суммы, а не времени и размера мода). Ваше предположение, что rsync только сэмплирует mtime и size, неверно.

Ответ 2

См. параметр --checksum на странице руководства rsync.

Кроме того, опция --size-only будет более быстрым выбором, если вы точно знаете, что изменение содержимого также означает изменение размера.

Ответ 3

Пример:

#!/bin/bash
echo > diff.txt
rsync -rvcn --delete /source/ /destination/ > diff.txt
second_row=$(sed -n '2p' diff.txt)
if [ "$second_row" = "" ]; then
    echo there was no change
else 
    echo there was change   
fi