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

114

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

rsync --size-only

и

rsync --ignore-times

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

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

Я упустил что-то тонкое?

alfred_j_kwack
источник
18
Это, вероятно, лучше подошло бы для чего-то вроде SuperUser.com или Unix.SE , поскольку речь идет об использовании существующего (не связанного с программированием) инструмента, а не чего-либо, непосредственно связанного с написанием кода.
Джерри Коффин

Ответы:

110

Есть несколько способов, которыми 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говорит о сравнении файлов независимо от того, имеют ли файлы одинаковое время изменения. Рассмотрим приведенный выше пример с опечаткой, но тогда вы не только исправили опечатку, но и использовали touchдля того, чтобы исправленный файл имел то же время изменения, что и исходный файл - давайте просто скажем, что вы подлый. Хорошо --ignore-timesпроведет сравнение файлов, даже если размер и время совпадают.

ckg
источник
58

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


Длинный ответ состоит в том, что rsyncесть три способа определить, устарел ли файл:

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

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

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

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

  • При использовании --ignore-timesни один, ни второй, ни третий не выполняются. Файл всегда копируется.

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

MisterMiyagi
источник
1
--checksum - это именно то, что я искал. Я копировал результат сборки, в котором было изменено время только для большинства файлов. Добавление --checksum означало, что он игнорировал разницу во времени, но удостоверился, что они совпадают бит за битом. Я ожидал, что --ignore-times сделает это, поэтому спасибо за дополнительную информацию.
Джозеф Коннолли
50

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

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

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

rjmunro
источник
4
«сброс даты / времени на практике маловероятен, но может случиться» - например, при использовании программного обеспечения, которое от имени воспроизводимых сборок принудительно сбрасывает каждый файл на 1970-01-01 вместо даты и время фактического создания / модификации.
10
На самом деле, я думаю, вам понадобится опция -c, если вы хотите использовать контрольные суммы. Без него --ignore-times безоговорочно скопирует все файлы.
Эдвард Фальк
1
Параметр -a может отменять эти параметры. В моем случае я использовал --compare-dir = и --size-only и получил неожиданные результаты. Изменение -a на -r решило проблему.
dbagnara
@dbagnara Сегодня я подтвердил, что --size-only "располагается поверх" -a или "отменяет" -a. У меня был диск, который по какой-то причине смонтировали, и время всех доработок увеличилось на месяц. Rsync to backup копировал каждый файл (с -a ON). Добавление --size-only устранило проблему и привело к желаемым результатам (поэтому -a --size-only). Итак, я прихожу к выводу, что только размер имеет приоритет над архивом.
Томми,
1

В системе Scientific Linux 6.7 на странице руководства по rsync говорится:

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

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

[root@windstorm ~]# 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

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

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

[root@windstorm ~]# 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этом два файла считаются разными:

[root@windstorm ~]# 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имеет никакого эффекта.

Питер Чиу
источник
2
--ignore-timesскопировал бы файлы, даже если бы их отметки времени были одинаковыми.
MisterMiyagi