rsync только определенное подмножество каталогов

5966
Martin Scharrer

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

У меня есть нужные каталоги в виде текстового файла, но у меня проблемы с созданием правильного файла правил фильтрации. Мои требования следующие:

  • Включить в мой список только каталоги со всеми файлами и подкаталогами в них.
  • Файлы во включенных каталогах должны быть удалены, если они удалены на сервере.
  • Однако все .hgкаталоги (хранилище Mercurial), расположенные на моем сайте, но не на сервере, а также все файлы и подкаталоги в них, удалять не следует.
  • Исключенные каталоги не должны быть удалены.

До сих пор я создал файл фильтра, который выглядит следующим образом

include sub/dir/I/want/*** include other/sub/dir/I/want/*** ... protect .hg/*** exclude ** 

Но это исключает все, по-видимому. Без excludeстроки все остальные файлы также включены.

4

2 ответа на вопрос

2
Martin Scharrer

Я нашел проблему. Мои проблемы были вызваны способом rsyncобработки имен файлов. Абсолютный (то есть относительно корня передачи) путь включения не работает напрямую, поскольку родительские каталоги также должны быть включены. В противном случае вся структура каталогов уже исключена, и требуемый файл или подкаталог никогда не обрабатывается. Само руководство говорит так (где-то), но оно очень нелогично.

Чтобы включить только некоторые вложенные каталоги, необходимо включить все родительские каталоги, а затем все остальные дочерние каталоги должны быть снова исключены:

include sub/ include sub/dir/ include sub/dir/I/ include sub/dir/I/want/*** exclude sub/* exclude sub/dir/* exclude sub/dir/I/*  include other/ include other/sub/ include other/sub/dir/ include other/sub/dir/I/ include other/sub/dir/I/want/*** exclude other/* exclude other/sub/* exclude other/sub/dir/* exclude other/sub/dir/I/*  ...  protect .hg* exclude /* 

Вторая-последняя строка защищает все .hg*каталоги и файлы, такие как .hg/и .hgtags. Линия исключает все остальные каталоги в корне передачи.

Я написал Perl-скрипт для создания файла фильтра из списка нужных подкаталогов. Он доступен по адресу http://www.perlmonks.org/?node_id=928357 .

0
grawity

Запустите rsync дважды.

rsync hostname::sub/dir/I/want/ ./sub/dir/I/want/ rsync hostname::other/sub/dir/I/want/ ./other/sub/dir/I/want/ 
У меня есть более 2000 дочерних папок, которые я хочу, так что это не вариант. Martin Scharrer 12 лет назад 1

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