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

Rsync: разница между --size-only и -ignore-times

Я пытаюсь понять, какая разница между двумя параметрами

rsync --size-only

и

rsync --ignore-times

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

Оба варианта кажутся, по крайней мере, устно, чтобы привести к тому же: сравнение только по размеру.

Я пропустил что-то тонкое здесь?

4b9b3361

Ответ 1

Существует несколько способов сравнения файлов rsync - авторитетным источником является описание алгоритма rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf. статья википедии о rsync тоже очень хороша.

Для локальных файлов rsync сравнивает метаданные, и если это похоже на то, что не нужно копировать файл, потому что размер и временная метка совпадают между источником и пунктом назначения, он не выглядит более удобным. Если они не совпадают, это cp файл. Однако, что, если метаданные совпадают, но файлы на самом деле не совпадают? Тогда rsync, вероятно, не сделал то, что вы намеревались.

Файлы с одинаковым размером могут быть изменены. Один простой пример - текстовый файл, в котором вы исправляете опечатку - например, меняете "teh" на "the". Размер файла тот же, но исправленный файл будет иметь более новую временную метку. --size-only говорит: "Не смотрите на время, если размер совпадает с совпадением файлов файлов", что было бы неправильным выбором в этом случае.

С другой стороны, предположим, что вы случайно сделали большой "cp -r A B" вчера, но вы забыли сохранить отметки времени, и теперь вы хотите выполнить операцию в обратном направлении "rsync B A". Все те файлы, с которыми вы работали, имеют вчерашний штамп, хотя вчера они не были действительно изменены, и rsync будет по умолчанию копировать все эти файлы и обновлять временную метку до вчерашнего дня. -size-only может быть вашим другом в этом случае (по модулю вышеприведенного примера).

- ignore-times говорит, чтобы сравнить файлы независимо от того, имеют ли файлы одинаковое время изменения. Рассмотрим вышеприведенный пример typo, но тогда вы не только исправили опечатку, но и использовали "touch", чтобы скорректированный файл имел такое же время изменения, что и исходный файл, - пусть просто скажите, что вы так скрыты. Well --ignore-times будет делать разницу между файлами, даже если размер и время совпадают.

Ответ 2

Вам не хватает того, что rsync также может сравнивать файлы по контрольной сумме.

--size-only означает, что rsync будет пропускать файлы, которые соответствуют по размеру, даже если метки времени отличаются. Это означает, что он синхронизирует меньше файлов, чем поведение по умолчанию. Он пропустит любой файл с изменениями, которые не влияют на общий размер файла. Если у вас есть что-то, что изменяет даты в файлах без изменения файлов, и вы не хотите, чтобы rsync тратил много времени на контрольные суммы этих файлов, чтобы обнаружить, что они не изменились, этот вариант можно использовать.

--ignore-times означает, что rsync будет --ignore-times контрольную сумму каждого файла, даже если метки времени и размеры файлов совпадают. Это означает, что он синхронизирует больше файлов, чем поведение по умолчанию. Он будет включать изменения в файлах, даже если размер файла одинаков, а дата и время изменения были сброшены до исходного значения. Контрольная сумма каждого файла означает, что он должен быть полностью прочитан с диска, что может быть медленным. Некоторые конвейеры сборки сбрасывают метки времени до определенной даты (например, 1970-01-01), чтобы гарантировать, что окончательный файл компоновки будет воспроизводимым бит за битом, например, когда он упакован в файл tar, который сохраняет метки времени.

Ответ 3

Короткий ответ заключается в том, что --ignore-times делает больше, чем подразумевает его название. Он игнорирует время и размер. Напротив, --size-only делает именно то, что он говорит.


Долгий ответ заключается в том, что rsync имеет три способа решить, устарел ли файл:

  1. Сравните размер источника и места назначения.
  2. Сравните временную метку источника и места назначения.
  3. Сравните статическую контрольную сумму источника и адресата.

Эти проверки выполняются перед передачей данных. Примечательно, что это означает, что статическая контрольная сумма отличается от контрольной суммы потока - последняя вычисляется при передаче данных.

По умолчанию rsync использует только 1 и 2. Оба 1 и 2 могут быть собраны вместе одним stat, тогда как 3 требует чтения всего файла (это не зависит от чтения файла для передачи). Предполагая, что указан только один модификатор, это означает следующее:

  • При использовании --size-only выполняется только 1 - метки времени и контрольная сумма игнорируются. Файл копируется, если его размер не идентичен на обоих концах.

  • Используя --ignore-times, не --ignore-times ни 1, 2, ни 3. Файл всегда копируется.

  • Используя --checksum, 3 используется в дополнение к 1, но 2 не выполняется. Файл копируется, если размер и контрольная сумма не совпадают. Контрольная сумма вычисляется только в том случае, если размер совпадает.

Ответ 4

В системе Scientific Linux 6.7 на странице man на rsync говорится:

--ignore-times          don't skip files that match size and time

У меня есть два файла с одинаковым содержимым, но с разными датами создания:

[[email protected] ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[[email protected] ~]# diff /tmp/master/usercron /tmp/new/usercron
[[email protected] ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

С --size-only оба файла считаются одинаковыми:

[[email protected] ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

С --ignore-times два файла считаются разными:

[[email protected] ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Таким образом, это не похоже на то, что --ignore-times имеет какой-либо эффект.