Вопрос или проблема
Я выполняю rsync -LvP some_local_files* host:dir
(связанная ссылка).
Это работает (соблюдаются символьные ссылки), но всегда передаёт все файлы заново, игнорируя то, что уже есть.
Как я могу этого избежать? То есть, я хочу передавать только файлы, которые ещё не скопированы.
Ответ или решение
При использовании команды rsync -LvP some_local_files* host:dir
для синхронизации файлов, следуя символьным ссылкам, вы столкнулись с проблемой, когда все файлы всегда перезаписываются, игнорируя уже существующие на удаленном сервере. Давайте разберем, как можно избежать этого и эффективно синхронизировать только те файлы, которые не были скопированы ранее.
Проблема
Ваша команда использует ключи:
-L
(или--copy-links
), который указываетrsync
следовать символьным ссылкам и копировать файлы, на которые они ссылаются.-v
(или--verbose
), который активирует детализированный вывод.-P
(который эквивалентен--partial --progress
), для отображения прогресса передачи и сохранения частичных файлов.
Однако, по умолчанию, rsync
будет проверять только по времени изменения файлов и размеру, если в команду не включен дополнительный параметр для контрольной суммы.
Решение
Чтобы избежать повторной передачи файлов, уже находящихся на удаленном сервере, выполните следующие шаги:
-
Проверка существующих файлов: Параметр
-n
(или--dry-run
) будет полезен для первоначальной проверки. Он покажет, какие файлы будут переданы, не выполняя фактической передачи. Это позволит вам убедиться в правильности выбора файлов. -
Подключение параметров, проверяющих уже существующие файлы: Убедитесь, что у вас включены все необходимые параметры для сравнения файлов. Для этого используйте
-c
(или--checksum
), чтобы сравнивать файлы по контрольным суммам. Однако, имейте в виду, что это может значительно замедлить процесс, так какrsync
будет вычислять контрольные суммы для всех файлов.Пример команды:
rsync -LvcP some_local_files* host:dir
-
Исключение параметра
-L
, если это возможно: Если символьные ссылки не обязаны следовать и вы можете передавать только оригинальные файлы, это может помочь избежать лишней передачи данных.
Итоговая команда
В зависимости от контекста использования, команда может выглядеть следующим образом:
rsync -vP --ignore-existing some_local_files* host:dir
Или с контрольной суммой:
rsync -cvP some_local_files* host:dir
Заключение
Использование rsync
с правильными флагами позволит эффективно синхронизировать файлы без повторной передачи уже существующих. Уделите внимание параметрам, которые соответствуют вашим нуждам, и протестируйте команду с ключом -n
, чтобы избежать неожиданных переполнений данных. Выбор неправильного параметра может привести к излишнему трафику и времени выполнения, что критично в производственных системах.