Přečetl jsem si tato vlákna:
Ale pokud vím, možná (něco mi chybí), nepokrývají následující otázku:
Jak požádáte rsync
o zkopírování souborů a odstranění těch na straně příjemce, které neexistují na straně odesílání, až na výjimky? (např. neodstraňujte úložiště Mercurial .hg
na straně příjemce, i když na straně odesílání není úložiště).
Výpůjčka od odpovědi @Richarda Hollowaye níže. Řekněme, že mám následující řádek:
rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path
Pokud to chápu, tento řádek způsobí, že rsync
odstraní vše na přijímací cestě, které na odesílací cestě neexistuje, kromě těch věcí, které odpovídají dont_delete_me
. Moje otázka je nyní: Zachoval by rsync soubory na přijímací straně, které odpovídají dont_delete_me
, i když se nic na straně odesílatele neodpovídá dont_delete_me
?
Pokud používáte --delete
a --exclude
společně to, co je na vyloučeném místě, nebude smazáno, i když budou odstraněny zdrojové soubory.
To však vyvolává problém, že složka nebude rsync
'd vůbec. Budete tedy potřebovat další úlohu rsync
do složky sync
.
Např.
rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh
Mohli byste je spustit opačně, ale pak by to odstranilo všechny odstraněné soubory a pak je nahradilo, což není tak efektivní.
Nemůžete to udělat jako jeden parník.
Zjistil jsem, že následující řešení funguje pro mé účely:
rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest
(Poznámka: Přidejte možnost -n
, Abyste provedli běh nasucho, a neměňte --delete
Na --delete-excluded
!)
Spuštění příkazu způsobí následující vlastnosti:
src
zůstává nezměněnCílová složka dest
odpovídá zdrojové složce s tou výjimkou:
do_not_send_to_dest
nejsou odeslány do cíle ado_not_modify_in_dest
zůstanou v cíli nezměněny.do_not_
“.)Vysvětlení
Myslím, že když rsync čte argumenty příkazového řádku zleva doprava, zdá se, že argument --delete
Způsobuje, že rsync interně "přepíná režimy" (v jistém smyslu), což umožňuje druhé použití --exclude-from
možnost znovu, ale s jiným významem.
Upozornění:
Pokud již položka v seznamu do_not_send_to_dest
V cílovém umístění existuje:
--delete
Na --delete-excluded
Smaže vše v cíli, které je uvedeno na jednom z vašich dvou seznamů. xD (Možná bylo napsáno, že rsync je otevřený/flexibilní, ale má nějaké nuance?)Lehce testováno použití.
Používám „rsync version 3.0.9 protocol version 30
“.