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