Как заставить rsync удалить каталоги из назначения, которых нет в списке источников

Как заставить rsync удалить каталоги из назначения, которых нет в списке источников

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

Вот небольшой пример:

mkdir dir1
touch dir1/file1
mkdir dir2
touch dir2/file2
mkdir dir3
rsync -a dir1 dir2 dir3

dir3 теперь содержит «dir1/file1» и «dir2/file2».

Если я снова выполню rsync и удалю dir2 из списка:

rsync -a dir1 dir3

Затем я хотел бы удалить dir2/file2 и dir2 из места назначения.

Параметр --delete для rsync обрабатывает только удаления между dir1 и dir3/dir1, поэтому dir2 остается (даже при использовании --delete).

Я просмотрел различные опции на странице руководства по rsync, и не вижу ни одной опции, которая бы говорила rsync "объединить" все источники и рассматривать их как "одно" дерево, чтобы "--delete" делал то, что мне нужно. Однако я почти уверен, что я не первый, кто хочет сделать что-то подобное.

Идеи?

решение1

Флаг --delete, очевидно, не работает, если вы синхронизируете несколько исходных каталогов с одним целевым каталогом. Вместо синхронизации dir1и dir2с dir3вы можете синхронизировать содержимое родительского каталога dir1и dir2.

Пример (использование флага rsync -iдля просмотра изменений):

$ mkdir -p dir12/dir1 dir12/dir2 dir3
$ touch dir12/dir1/file1 dir12/dir2/file2
$ rsync -ai dir12/ dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
# BEFORE: dir1 and dir2 were synced to dir3
$ rm -rf dir12/dir2
$ rsync -ai --delete dir12/ dir3
*deleting   dir2/file2
*deleting   dir2/
.d..t...... ./
# AFTER: dir3/dir2 is gone

Если у вас нет общего родительского каталога, то это dir12/dir2может быть символическая ссылка, указывающая на реальный каталог. С опцией -L( --copy-links) в первом rsyncвызове вы получите ту же структуру каталогов в dir3качестве dir2каталога (вместо символической ссылки). А после удаления символической ссылки dir12/dir2и повторной синхронизации с --deleteкаталогом dir3/dir2он исчезнет, ​​как в примере.

РЕДАКТИРОВАТЬ:

Я немного повозился и, возможно, нашел способ:

$ mkdir empty dir1 dir2 dir3
$ touch dir1/file1 dir2/file2
$ rsync -ai dir1 dir2 dir3
cd+++++++++ dir1/
>f+++++++++ dir1/file1
cd+++++++++ dir2/
>f+++++++++ dir2/file2
$ rsync -ai --delete empty/ dir1 dir3
*deleting   dir2/file2
*deleting   dir2/
.d..t...... ./

Используйте empty/в качестве заполнителя для всех каталогов, которые вы хотите удалить.

Связанный контент