Вопрос или проблема
Я выполняю rsync -LvP some_local_files* host:dir
(ссылка).
Это работает (следует за символьными ссылками), но всегда retransmits все файлы, игнорируя то, что уже там.
Как я могу этого избежать? То есть, я хочу передавать только файлы, которые еще не были скопированы.
Это, похоже, связано с тем, что на целевом хосте, с опциями -LvP
, когда
файл создается, он не получает отметку времени исходного файла или
даже исходной символьной ссылки, а вместо этого получает отметку времени “сейчас”.
Добавив опцию -t
или --times
, время модификации исходного файла устанавливается на целевом хосте. Будущие rsync обнаруживают, что файл такого же размера и с такой же отметкой времени, и поэтому он больше не копируется снова.
Ответ или решение
Когда вы используете команду rsync -LvP some_local_files* host:dir
, обнаруживаемая проблема заключается в том, что при передаче файлов по символическим ссылкам все файлы повторно передаются, несмотря на то что они уже могут находиться на целевой стороне. Это поведение связано с тем, что при создании файла на удаленном сервере он получает текущую метку времени, а не метку времени исходного файла или даже метки времени самой символической ссылки. Рассмотрим, как это можно исправить и оптимизировать процесс передачи файлов с помощью rsync
.
Анализ проблемы
Проблема возникает из-за опций, используемых в команде rsync
:
- -L (или
--copy-links
) — следует за символическими ссылками и копирует файлы, на которые они указывают. - -v (или
--verbose
) — выводит подробную информацию о процессе передачи. - -P (или
--partial --progress
) — позволяет продолжать прерванные передачи и показывает прогресс.
При использовании этих опций rsync
создает файлы на целевой стороне, устанавливая их метку времени на момент создания, что приводит к тому, что при следующем запуске rsync
эти файлы кажутся новыми, и программа снова передает их.
Решение проблемы
Чтобы избежать повторной передачи файлов, необходимо использовать опцию -t
(или --times
), которая позволяет сохранить метку времени файлов. Это означает, что после передачи файла на удаленный сервер rsync
сохранит метку времени исходных файлов. На следующем запуске, если метка времени и размер файла совпадают, rsync
не будет повторно передавать этот файл.
Таким образом, правильный синтаксис команды будет выглядеть следующим образом:
rsync -LvtP some_local_files* host:dir
Полный синтаксис с рекомендациями
Включение опции -t
играет ключевую роль, предотвращая ненужные повторные передачи файлов. Теперь rsync
будет следовать за символическими ссылками, передавать файлы, и, что важно, сохранять оригинальные метки времени.
Резюме
Используя команду rsync -LvtP
, вы сможете избежать повторной передачи файлов, если они уже существуют на целевом сервере с теми же размерами и метками времени. Это не только экономит ваше время и ресурсы, но и увеличивает общую эффективность передачи данных. При интеграции этих изменений в вашу рабочую среду, вы заметите значительное улучшение в производительности при использовании rsync
.