Может rsync проверить содержимое перед синхронизацией - PullRequest
12 голосов
/ 12 октября 2011

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

Ответы [ 3 ]

29 голосов
/ 12 октября 2011

Да

$ 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, неверно.

9 голосов
/ 12 октября 2011

См. Параметр --checksum на справочной странице rsync.

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

0 голосов
/ 28 июля 2016

Пример:

#!/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
...