Вопрос или проблема
Сейчас у меня есть такие команды:
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
предоставляет гибкие возможности для управления синхронизацией файлов и может настроиться под конкретные нужды, обеспечивая наибольшую эффективность и надежность операций копирования. Использование правильных опций позволит добиться желанного результата — синхронизации только новых или измененных файлов без ненужной перезаписи существующих данных.