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