Контрольная сумма Rsync только для файлов того же размера
Там есть куча потоков, относящихся к контрольной сумме rsync, но никто не обращается к этой необходимости, что было бы самым эффективным и быстрым способом синхронизации, по крайней мере, в моем случае:
- то же время и тот же размер ► пропустить файл (без передачи, без контрольной суммы)
- разные размеры ► файл передачи (без контрольной суммы)
- разные времена и одинаковый размер ► выполнять контрольную сумму ► передавать только в том случае, если контрольные суммы отличаются
Я заметил, что опция --checksum
может занять много времени, чтобы зеркалировать папку, если есть много файлов. Только с помощью этого параметра будет запускаться контрольная сумма для каждого файла, что очень безопасно, но очень медленно. Кроме того, он будет вызывать накладные расходы на чтение для вычисления контрольной суммы.
Опция --ignore-times
не то, что я хочу, если время и размер совпадают, вероятность того, что файлы разные, незначительна, я готов рискнуть не переносить.
Опция --size-only
является неполной, так как есть хорошая вероятность, что файлы с одинаковым размером, но в разное время могут быть разными файлами (например, изменение char в другом может не повлиять на размер, просто время издания).
Есть ли способ выполнить зеркалирование в соответствии с приведенной выше комбинацией, с rsync (я пропустил что-то в manpages) или с любыми другими инструментами Linux?
Спасибо.
Ответы
Ответ 1
При определении того, передавать ли файлы (или с помощью --dry-run
, следует ли перечислить файлы), rsync всегда будет передавать файлы, которые отличаются размером файла. Однако, когда файлы имеют одинаковый размер, rsync имеет несколько опций:
- с
--size-only
: никогда не передавать файлы
- с
--ignore-times
: всегда передавать файлы
- default: если временные метки отличаются, передача файлов
- с
--checksum
: вычислять контрольные суммы и передавать файлы, если они отличаются
Поведение, которое вы хотите, будет сочетанием двух последних: "если временные метки отличаются, вычислять контрольные суммы и передавать файлы, если контрольные суммы также отличаются".
В настоящее время это не опция в rsync.
К сожалению, глядя на исходный код rsync, кажется, было бы нетривиально добавить эту функциональность. В настоящее время, если контрольные суммы используются, удаленный rsync собирает информацию о размере, времени и контрольной информации и отправляет их все вместе. Желаемое поведение потребует, чтобы удаленный rsync сначала отправлял по размеру и временной отметке, а когда локальный rsync определяет, что контрольная сумма необходима, возвращается в файл, чтобы получить контрольную сумму. Но весь "удаленный rsync возвращает к файлу" аспект отсутствует в текущем коде, и сначала его нужно будет записать.
Когда вы выполняете фактическую передачу, второй шаг может быть эффективно выполнен во время процесса передачи: передача файлов, которые не отличаются, очень эффективна. Таким образом, поведение rsync по умолчанию было бы достаточно. При использовании --dry-run
наилучшим подходом было бы, вероятно, сначала запустить rsync с поведением по умолчанию, собрать вывод --dry-run
, а затем снова запустить rsync с помощью --checksum
в файлах, найденных в первом прогоне.
Ответ 2
Короткий ответ... он делает.
same time and same size ► skip file (no transfer, no checksum)
Хороший и быстрый, но не точный, rsync предлагает это по умолчанию. Файл может быть изменен, а время/размер остаются неизменными. (времена могут быть reset). Вы можете использовать -c, если параноидально.
different sizes ► transfer file (no checksum)
Упрощенный... что, если это 2-гигабайтный файл... и единственная разница - 1 строка в конце? Контрольная сумма может понять это и избавить сетевой трафик. Вы можете использовать -c, если вы доверяете сопоставлению времени и размера.
different times and same size ► perform checksum ► transfer only if checksums differ
Конечно.
Я не вижу этого, но я помню, что rsync имел обыкновение иметь проблему, если бы все было позади... Я думаю, что это было около 130 000 файлов. Возможно, этот вопрос был исправлен.
Если у вас есть много файлов в одном каталоге, у вас, вероятно, больше проблем... разбросайте их по разным каталогам и выполните несколько rsyncs в этих нескольких каталогах.
Много мелких файлов (на большинстве файловых систем) имеют много внутренних проблем фрагментации, и вам может быть лучше архивировать файлы и rsyncing архив... вам нужен архиватор, который позволяет обновлять архив, а не воссоздавать его все время.
Возможно, если не так много этих файлов обновляется... найдите те, которые были изменены после даты (найдите --newer файл), а затем rsync только эти файлы. (если вы доверяете временам)
Почему этот вопрос так долго игнорировался?