Подтвердить что ты не робот

Контрольная сумма Rsync только для файлов того же размера

Там есть куча потоков, относящихся к контрольной сумме rsync, но никто не обращается к этой необходимости, что было бы самым эффективным и быстрым способом синхронизации, по крайней мере, в моем случае:

  • то же время и тот же размер ► пропустить файл (без передачи, без контрольной суммы)
  • разные размеры ► файл передачи (без контрольной суммы)
  • разные времена и одинаковый размер ► выполнять контрольную сумму ► передавать только в том случае, если контрольные суммы отличаются

Я заметил, что опция --checksum может занять много времени, чтобы зеркалировать папку, если есть много файлов. Только с помощью этого параметра будет запускаться контрольная сумма для каждого файла, что очень безопасно, но очень медленно. Кроме того, он будет вызывать накладные расходы на чтение для вычисления контрольной суммы.
Опция --ignore-times не то, что я хочу, если время и размер совпадают, вероятность того, что файлы разные, незначительна, я готов рискнуть не переносить.
Опция --size-only является неполной, так как есть хорошая вероятность, что файлы с одинаковым размером, но в разное время могут быть разными файлами (например, изменение char в другом может не повлиять на размер, просто время издания).

Есть ли способ выполнить зеркалирование в соответствии с приведенной выше комбинацией, с rsync (я пропустил что-то в manpages) или с любыми другими инструментами Linux?
Спасибо.

4b9b3361

Ответ 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 только эти файлы. (если вы доверяете временам)

Почему этот вопрос так долго игнорировался?