Вопрос или проблема
Я ищу способ ‘объединить’ две исходные папки в одну папку назначения и удалить все в папке назначения, что не находится в обеих исходных папках.
Я предполагаю, что любое решение нужно написать в виде bash-скрипта, с которым у меня есть некоторый опыт, но не уверен, как реализовать это требование (предполагая, что это вообще возможно?).
Например, рассмотрим следующую ситуацию до запуска rsync…
ИСТОЧНИКИ
Myfolder (на HDD X)
File1
File2
File3
File4
File5
Myfolder (на HDD Y)
FileA
FileB
FileC
FileD
FileE
НОСИТЕЛЬ НАЗНАЧЕНИЯ
Myfolder (на HDD Z)
File7
File8
File9
РЕЗУЛЬТАТ
После выполнения rsync, я хочу, чтобы папка назначения содержала…
Myfolder (на HDD Z)
File1
File2
File3
File4
File5
FileA
FileB
FileC
FileD
FileE
то есть
- копирует File1 до File5 из Myfolder (на HDD X) в Myfolder (на HDD Z)
- копирует FileA до FileE из Myfolder (на HDD Y) в Myfolder (на HDD Z)
- удаляет File7 до File9 из Myfolder (на HDD Z)
Если бы я использовал rsync для синхронизации исходной Myfolder (на HDD X) с папкой назначения Myfolder (на HDD Z), то скопировались бы File1 до File5, и File7 до File9 были бы удалены.
Но если бы я затем использовал rsync для синхронизации исходной Myfolder (на HDD Y) с папкой назначения Myfolder (на HDD Z), то скопировались бы FileA до FileE, и File1 до File5 были бы удалены.
Да, rsync
безусловно может это сделать. Хитрость заключается в том, чтобы сказать rsync
синхронизировать обе исходные директории в одну папку назначения за один вызов. Смотрите ниже:
$ mkdir -v Myfolder_HDD_{X..Z}
Myfolder_HDD_X
Myfolder_HDD_Y
Myfolder_HDD_Z
$ touch Myfolder_HDD_X/File{1..5}
$ touch Myfolder_HDD_Y/File{A..E}
$ touch Myfolder_HDD_Z/File{7..9}
$ find . -mindepth 2 | sort
./Myfolder_HDD_X/File1
[...]
./Myfolder_HDD_X/File5
./Myfolder_HDD_Y/FileA
[...]
./Myfolder_HDD_Y/FileE
./Myfolder_HDD_Z/File7
./Myfolder_HDD_Z/File8
./Myfolder_HDD_Z/File9
$ rsync -n -HAXav --delete Myfolder_HDD_X/ Myfolder_HDD_Y/ Myfolder_HDD_Z/
sending incremental file list
deleting File9
deleting File8
deleting File7
File1
[...]
File5
FileA
[...]
FileE
sent 271 bytes received 69 bytes 680.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Если файлы, перечисленные в ходе выполнения -n
для rsync
, выглядят правильно для вас, выполните команду rsync
без -n
.
Ответ или решение
Вопрос о возможности объединения двух исходных папок в одну папку назначения с помощью rsync
с аргументом --delete
— это задача, требующая тщательного подхода и понимания работы команды rsync
, особенно если вы хотите достичь заданного результата с максимальной эффективностью и минимальными рисками.
Теория
rsync
— это мощная утилита для синхронизации файлов и папок, предоставляющая множество опций для управления поведением копирования. Главная функциональность rsync
заключается в способности эффективно сравнивать содержимое источника и назначения на уровне блоков данных, копировать только измененные файлы и удалять ненужные файлы в папке назначения при задании соответствующего аргумента.
Аргумент --delete
в rsync
служит для удаления в папке назначения всех файлов и папок, которые отсутствуют в источнике. Однако его прямое использование в нашей задаче приведет к удалению файлов из первой синхронизации, когда будет выполняться синхронизация второй папки источника, что нарушит конечную цель — объединение содержимого двух исходных папок.
Пример
Рассмотрим пример, в котором у нас есть два исходных каталога, Myfolder
на HDD X и Myfolder
на HDD Y, и каталог назначения Myfolder
на HDD Z. В исходных папках находятся различные файлы, которые необходимо объединить в папке назначения, сфокусировавшись на удалении всех предыдущих данных, но сохраняя новые файлы от обеих папок источников.
Инициализация данных:
# Создаем исходные и целевую папки
mkdir -v Myfolder_HDD_{X..Z}
# Заполняем их необходимыми файлами
touch Myfolder_HDD_X/File{1..5}
touch Myfolder_HDD_Y/File{A..E}
touch Myfolder_HDD_Z/File{7..9}
# Показываем текущую иерархию файлов
find . -mindepth 2 | sort
Перед выполнением окончательных действий при помощи rsync
, полезно воспользоваться режимом сухого запуска (-n
), чтобы убедиться в правильности предполагаемых действий.
Синхронизация с использованием rsync
:
Для достижения поставленной цели, вы должны обязательно понимать, что вам нужно объединить оба источника в один запуск rsync
. При этом необходимо идентифицировать файлы, которые присутствуют в обоих источниках и удалить все не относящиеся к ним файлы в папке назначения.
# Выполняем объединение двух источников в одну папку назначения
rsync -n -HAXav --delete Myfolder_HDD_X/ Myfolder_HDD_Y/ Myfolder_HDD_Z/
Запуск с -n
(режим сухого запуска) позволяет провести симуляцию без реального изменения файловой структуры; эта опция дает возможность детально изучить, какие файлы будут удалены, добавлены или изменены.
Применение
Чтобы окончательно применить эти изменения, достаточно повторно запустить команду без -n
. Однако, стоит сделать акцент на следующем:
-
Резервное копирование: Перед любыми операциями удаления, всегда выполняйте полное резервное копирование важных данных.
rsync
с аргументом--delete
потенциально может привести к потере данных, если не принять должных мер предосторожности. -
Проверка результатов: Применив краткий сухой запуск и сопоставив ожидаемый и виртуальный результаты с помощью
find
, можно убедиться в корректности выполнения задачи. -
Автоматизация: Создайте скрипт bash, который автоматизирует этот процесс при регулярной потребности, включая логику материального копирования и анализа ошибок.
С наступлением забывчивости и риска потери данных стоит реализовать регулярный периодический цикличный мониторинг системы. Это будет вашим гарантом в случае сбоя или ошибочной команды.
Заключительным шагом можно рассматривать реализацию более сложных сценариев при помощи rsync
в костяк вашей системы резервного копирования и восстановления, наравне с другими подобными инструментами, открывая возможности для интеграции с системами контроля версий или системами для управления данными с большим количеством данных.
В итоге, rsync
способен обеспечить сложные сценарии управления файлами при минимуме системных ресурсов и максимуме гибкости — важно лишь правильно применять доступные инструменты и уметь рассматривать ситуацию комплексно.