Как rsync решает, какие файлы нужно обновить?

Вопрос или проблема

Сейчас у меня есть такие команды:

my_dir="$HOME/foo/bar";

rm -rf "$my_dir/WebstormProjects/";

rsync -r --exclude=".git" --exclude="node_modules" "$HOME/WebstormProjects/" "$my_dir/WebstormProjects/"

вместо того чтобы удалять все в "$my_dir/WebstormProjects/", а затем копировать, я хочу использовать rsync так, чтобы он перезаписывал файлы в "$my_dir/WebstormProjects/" только если файлы в "$HOME/WebstormProjects/" новее. То есть что-то вроде этого:

my_dir="$HOME/foo/bar";

rsync -r --newer --exclude=".git" --exclude="node_modules" "$HOME/WebstormProjects/" "$my_dir/WebstormProjects/"

возможно ли копировать файлы только если они новее файлов назначения?

Я немного почитал:
https://www.tecmint.com/sync-new-changed-modified-files-rsync-linux/

там говорится:

По умолчанию, rsync копирует только новые или измененные файлы из источника в
пункт назначения…

Я предполагаю, что он делает это, сравнивая относительные пути файлов? Файлы с одинаковым путем/именем считаются одинаковыми?

Это поведение по умолчанию для rsync. Он проверяет размер файла и время последнего изменения.

Если вы хотите использовать контрольные суммы вместо этого, используйте опцию -c или --checksum (тот же эффект). Страница man находится здесь и описывает эту опцию, также может быть интересной опция --size-only

Ответ или решение

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

Теория

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

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

Пример

Рассмотрим вашу задачу: вы хотите синхронизировать файлы из директории "$HOME/WebstormProjects/" в директорию "$my_dir/WebstormProjects/", избегая перезаписи файлов, если источники не новее. Чтобы это реализовать, можно использовать стандартные возможности rsync.

Сначала необходимо обратить внимание на следующие ключи, которые могут быть полезны:

  • -r (или --recursive): Рекурсивное копирование каталогов.
  • --exclude: Исключение заданных файлов или директорий, таких как .git и node_modules.
  • -u (или --update): Пропуск файлов, которые на целевой стороне новее. Эта опция поддерживает вашу цель не перезаписывать более новые файлы.

Следовательно, ваша команда может выглядеть следующим образом:

my_dir="$HOME/foo/bar";

rsync -ru --exclude=".git" --exclude="node_modules" "$HOME/WebstormProjects/" "$my_dir/WebstormProjects/"

Эта команда будет рекурсивно копировать только те файлы, которые новее, тем самым избегая ненужной перезаписи.

Применение

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

Пример команды с использованием контрольной суммы:

my_dir="$HOME/foo/bar";

rsync -rc --checksum --exclude=".git" --exclude="node_modules" "$HOME/WebstormProjects/" "$my_dir/WebstormProjects/"

Это может быть особенно полезно в ситуациях, где существует вероятность проблем с сохранением времени модификации файлов, или если файлы могут изменяться без изменения размера.

Важно также учитывать, что использование rsync с ключами, подходящими для вашей задачи, позволяет оптимизировать действия по синхронизации данных, сокращая время и ресурсы, затраченные на копирование, а также обеспечивая целостность и актуальность данных как в исходной, так и в целевой директориях.

В заключение, rsync предоставляет гибкие возможности для управления синхронизацией файлов и может настроиться под конкретные нужды, обеспечивая наибольшую эффективность и надежность операций копирования. Использование правильных опций позволит добиться желанного результата — синхронизации только новых или измененных файлов без ненужной перезаписи существующих данных.

Оцените материал
Добавить комментарий

Капча загружается...