Complex obejmuje / wyklucza z rsync

14

Próbuję wypracować składnię filtra rsync, aby wykonać złożone włączanie / wykluczanie, i próbuję osiągnąć następujące wyniki:

Include /
Exclude /home
Include /home/user1/*
Include /home/user2/subdir/*

Próbowałem wielu odmian składni filtra i pomimo wielokrotnego czytania strony podręcznika, nie mogę uzyskać tego rodzaju efektu. Filtry Rsync wydają się być bardzo wydajne i trudno mi uwierzyć, że nie poradzą sobie z takim typowym scenariuszem.

Brianmathis
źródło

Odpowiedzi:

17

Musisz dołączyć wszystkie katalogi nadrzędne do pożądanego katalogu przed użyciem reguły wykluczania.

Na przykład używam następujących w skrypcie kopii zapasowej:

rsync -av \ 
--filter='+ /var/' \
--filter='+ /var/backups/' \
--filter='- /var/*' \
/ \
$DEST

W twoim przypadku potrzebujesz czegoś takiego:

rsync -av \ 
--filter='+ /home/' \
--filter='+ /home/user1/' \
--filter='+ /home/user2/' \
--filter='+ /home/user2/subdir/' \
--filter='- /home/user2/*' \
--filter='- /home/*' \
/ \
$DEST
Shane Meyers
źródło
Doskonały. Zajęło mi to trochę czasu.
yclian
W jakiś sposób, kiedy czytam man rsync, źle zrozumiałem prawidłową kolejność miksowania włączania i wyłączania. Zrozumienie go zajęło mi godzinę ...
Adam Ryczkowski
6

W wierszu poleceń:

rsync --dry-run --verbose --recursive --include=/home/user1 --exclude=/home/* / DEST

Usuń, --dry-runaby działało, zamień „DEST” na miejsce docelowe i dodaj użytkownika i hosta do źródła „/”, jeśli to konieczne.

Z pliku reguł:

rsync --dry-run --verbose --recursive --filter='merge /etc/rsync/somerules.rules' / DEST

gdzie zawartość /etc/rsync/somerules.rulesmoże być:

+/ /home/user1
-/ /home/*

Powinieneś je przetestować i być może będziesz musiał wprowadzić pewne poprawki, ale to powinno zacząć.

Wstrzymano do odwołania.
źródło
OK, to działa. Mam bardziej złożony przypadek, który dodałem do pytania. Dodatkowe dołączenie nie działa w scenariuszu podkatalogu.
brianmathis,