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

Перезагрузка конфигурации - это функция, которую поддерживают не все программы. В частности, ресурсы X обычно считываются при запуске программы; не существует протокола, уведомляющего приложение о том, что оно должно использовать новые ресурсы¹. Rxvt стремится быть маленьким, поэтому неудивительно, что он не поддерживает перезагрузку своей конфигурации после запуска.

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

printf '\33]50;%s\007' … >/dev/pts/42

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

for pts in $(ps x -o tty= | sort -u); do
  case "$pts" in pts/*) printf … >"/dev/$pts";; esac
done

¹ Вообще-то, есть один - editres - но кто слышал о editres? Никто, вот кто.

1
28.05.2019, 04:35
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/в качестве заполнителя для всех каталогов, которые вы хотите удалить.

2
27.01.2020, 23:30

Теги

Похожие вопросы