Я пытаюсь понять, в чем разница между двумя вариантами
rsync --size-only
и
rsync --ignore-times
Насколько я понимаю, по умолчанию rsync будет сравнивать как временные метки, так и размеры файлов, чтобы решить, следует ли синхронизировать файл или нет. Приведенные выше параметры позволяют пользователю влиять на это поведение.
Кажется, что оба варианта, по крайней мере на словах, приводят к одному и тому же: сравнение только по размеру .
Я упустил что-то тонкое?
Ответы:
Есть несколько способов, которыми 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
проведет сравнение файлов, даже если размер и время совпадают.источник
Короткий ответ -
--ignore-times
это больше, чем следует из названия. Он игнорирует как время и размер. Напротив,--size-only
делает именно то, что говорит.Длинный ответ состоит в том, что
rsync
есть три способа определить, устарел ли файл:Эти проверки выполняются перед передачей данных. Примечательно, что это означает, что статическая контрольная сумма отличается от контрольной суммы потока - последняя вычисляется при передаче данных.
По умолчанию
rsync
используются только 1 и 2. И 1, и 2 могут быть получены вместе однимstat
, тогда как 3 требует чтения всего файла (это не зависит от чтения файла для передачи). Предполагая, что указан только один модификатор, это означает следующее:При использовании
--size-only
выполняется только 1 - отметки времени и контрольная сумма игнорируются. Файл копируется, если его размер не одинаков на обоих концах.При использовании
--ignore-times
ни один, ни второй, ни третий не выполняются. Файл всегда копируется.При использовании
--checksum
3 используется в дополнение к 1, но 2 не выполняется. Файл копируется, если размер и контрольная сумма не совпадают. Контрольная сумма вычисляется только при совпадении размера.источник
Вам не хватает того, что rsync может также сравнивать файлы по контрольной сумме.
--size-only
означает, что rsync будет пропускать файлы, совпадающие по размеру, даже если метки времени различаются. Это означает, что он будет синхронизировать меньше файлов, чем поведение по умолчанию. Он пропустит любой файл с изменениями, не влияющими на общий размер файла. Если у вас есть что-то, что изменяет даты в файлах без изменения файлов, и вы не хотите, чтобы rsync тратил много времени на контрольную сумму этих файлов, чтобы обнаружить, что они не изменились, этот вариант можно использовать.--ignore-times
означает, что rsync будет вычислять контрольную сумму для каждого файла, даже если метки времени и размеры файлов совпадают. Это означает, что он синхронизирует больше файлов, чем поведение по умолчанию. Он будет включать изменения в файлы, даже если размер файла такой же, а дата / время изменения были сброшены на исходное значение. Контрольная сумма каждого файла означает, что он должен быть полностью прочитан с диска, что может быть медленным. Некоторые конвейеры сборки сбрасывают временные метки на определенную дату (например, 1970-01-01), чтобы гарантировать, что окончательный файл сборки будет воспроизводиться бит за битом, например, когда он упакован в файл tar, который сохраняет метки времени.источник
В системе Scientific Linux 6.7 на странице руководства по rsync говорится:
У меня есть два файла с одинаковым содержимым, но с разными датами создания:
С
--size-only
два файла считаются одинаковыми:При
--ignore-times
этом два файла считаются разными:Так что, похоже, это не
--ignore-times
имеет никакого эффекта.источник
--ignore-times
скопировал бы файлы, даже если бы их отметки времени были одинаковыми.