it-swarm-eu.dev

Požádání rsync o odstranění souborů na straně příjemce, které neexistují na straně odesílání, s výjimkou na straně příjemce

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ě).

Jedna možnost?

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?

29

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.

33
Richard Holloway

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:

  • Zdrojový adresář src zůstává nezměněn
  • Cílová složka dest odpovídá zdrojové složce s tou výjimkou:

    • položky v seznamu do_not_send_to_dest nejsou odeslány do cíle a
    • položky v seznamu do_not_modify_in_dest zůstanou v cíli nezměněny.
  • (Poznámka: Není problém, aby neexistující položky byly uvedeny v jednom ze souborů „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:

    • tento příkaz neodstraní tuto položku z cíle (pokud není položka nejprve odebrána ze zdrojového adresáře)
    • Pozor: změna --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“.

4
user2533809