Вопрос или проблема
В следующей последовательности я не вижу, почему 4-й случай скопирует foo.xml
. Похоже, что опция -t
отменяет опцию --compare-dest
. Почему так?
tree data
echo "-[1]----------------------------------------------"
rsync -rvn --size-only --ignore-times data/old/ data/new/
echo "-[2]----------------------------------------------"
rsync -rvn --size-only --ignore-times --compare-dest=$PWD/data/old/ data/new/ data/delta/
echo "-[3]----------------------------------------------"
rsync -rvntO --size-only --ignore-times data/old/ data/new/
echo "-[4]----------------------------------------------"
rsync -rvntO --size-only --ignore-times --compare-dest=$PWD/data/old/ data/new/ data/delta/
Результат:
(Два XML файла имеют одинаковое содержимое, но не одинаковое время модификации.)
data
├── delta
├── new
│ └── foo.xml
└── old
└── foo.xml
3 каталога, 2 файла
-[1]----------------------------------------------
отправка инкрементального списка файлов
отправлено 64 байта получено 12 байт 152,00 байт/сек
общий размер 2.055 ускорение 27,04 (ТЕСТ)
-[2]----------------------------------------------
отправка инкрементального списка файлов
отправлено 64 байта получено 12 байт 152,00 байт/сек
общий размер 2.055 ускорение 27,04 (ТЕСТ)
-[3]----------------------------------------------
отправка инкрементального списка файлов
отправлено 67 байт получено 19 байт 172,00 байт/сек
общий размер 2.055 ускорение 23,90 (ТЕСТ)
-[4]----------------------------------------------
отправка инкрементального списка файлов
foo.xml
отправлено 71 байт получено 19 байт 180,00 байт/сек
общий размер 2.055 ускорение 22,83 (ТЕСТ)
(Забавный факт: сообщения “XX байт отправлено” не всегда показывают одно и то же значение между двумя запусками)
Результат при добавлении опции “–itemize-changes, -i”:
-[1]----------------------------------------------
отправка инкрементального списка файлов
отправлено 59 байт получено 12 байт 142,00 байт/сек
общий размер 4 ускорение 0,06 (ТЕСТ)
-[2]----------------------------------------------
отправка инкрементального списка файлов
отправлено 64 байта получено 12 байт 152,00 байт/сек
общий размер 4 ускорение 0,05 (ТЕСТ)
-[3]----------------------------------------------
отправка инкрементального списка файлов
.f..t...... foo.txt
отправлено 66 байт получено 19 байт 170,00 байт/сек
общий размер 4 ускорение 0,05 (ТЕСТ)
-[4]----------------------------------------------
отправка инкрементального списка файлов
cf..t...... foo.txt
отправлено 71 байт получено 19 байт 180,00 байт/сек
общий размер 4 ускорение 0,04 (ТЕСТ)
.
Ответ или решение
Вопрос о том, почему опция -t
(которая сохраняет время последней модификации) "отменяет" опцию --compare-dest
в утилите rsync
, требует глубокого понимания работы этих параметров и основ их взаимодействия.
Понимание параметров -t
и --compare-dest
-
Опция
-t
(или--times
): Эта опция заставляетrsync
сохранять время изменения файла при копировании. При включении этой опции утилита будет сравнивать время изменения файла как один из критериев, определяющих, нужно ли копировать файл. -
Опция
--compare-dest
: Эта опция используется для указания дополнительного источника, с которымrsync
будет сравнивать файлы. Если файл в целевой директории отличается по содержимому или размеру (в зависимости от других параметров), то его копируют.
Что происходит в каждом из приведенных случаев
-
Случай [1] и [2]: В обоих случаях используется
--size-only
, что означает, чтоrsync
будет сравнивать только размер файлов, игнорируя время модификации. При использовании--compare-dest
, файлы в целевой директории сравниваются с теми же файлами в каталогеold
, и так как файлfoo.xml
имеет одинаковый размер, его не копируют. -
Случай [3]: Здесь всё еще используется
--size-only
, но каждый файл проверяется на основе его текущего состояния в директорииold
.rsync
сообщает о необходимых изменениях в файлеfoo.xml
, даже если его содержимое идентично. -
Случай [4]: Ключевой момент в этом случае – наличие опции
-t
. Когда добавляется-t
,rsync
начинает уделять внимание времени изменения файлов. По сути, он становится "более чувствительным" ко времени последней модификации файлов и, следовательно, возвращает файлfoo.xml
по причине, что хотя их содержание может быть идентичным, время последней модификации отличается.
Почему -t
отменяет --compare-dest
Опция -t
инициирует дополнительную логику сравнения, которая рассматривает время модификации как ключевой фактор. В большинстве случаев, когда используется --compare-dest
, rsync
игнорирует время изменения для определения необходимости копирования файла, основываясь только на размере и содержимом. Однако, когда вы добавляете -t
, процесс сравнения становится более строгим: файлы, которые отличаются по времени и не только по размеру, будут скопированы, даже если содержимое совпадает.
Заключение
Таким образом, выбор между использованием -t
и --compare-dest
при сравнении файлов в rsync
становится критически важным и зависит от целей, которые вы преследуете при синхронизации данных. Если вы хотите сохранить время изменения файлов, используйте -t
, но помните, что это может привести к ситуации, когда файлы, которые вы ожидали, что не будут скопированы из-за их идентичных содержаний, тем не менее будут скопированы из-за различия во времени изменения.
Эта информация полезна для IT-специалистов, работающих с rsync
, так как понимание нюансов этих параметров может существенно повлиять на эффективность и корректность выполнения задач по синхронизации данных.