it-swarm.it

Chiedere a rsync di eliminare i file sul lato di ricezione che non esistono sul lato di invio, con eccezioni sul lato di ricezione

Ho letto questi thread:

Ma, per quanto posso dire (forse mi manca qualcosa), non coprono la seguente domanda:

Come si chiede a rsync di copiare file ed eliminare quelli sul lato di ricezione che non esistono sul lato di invio, con eccezioni? (ad es. non rimuovere un repository Mercurial .hg sul lato ricevente, anche se non esiste un repository sul lato inviante).

Una possibilità?

Prendendo in prestito dalla risposta di @Richard Holloway di seguito. Di 'che ho la seguente riga:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Per quanto ho capito, questa riga farebbe in modo che rsync eliminasse tutto sul percorso di ricezione che non esiste sul percorso di invio, ad eccezione di quelle cose corrispondenti a dont_delete_me. La mia domanda ora è: rsync manterrebbe i file sul lato ricevente che corrispondono a dont_delete_me anche se nulla sul lato di invio corrisponde a dont_delete_me?

29

Se usi --delete e --exclude insieme ciò che si trova nella posizione esclusa non verrà eliminato anche se i file di origine vengono rimossi.

Ma ciò solleva il problema che la cartella non sarà affatto rsync 'd. Quindi avrai bisogno di un altro lavoro rsync su sync quella cartella.

Per esempio.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Potresti eseguirli viceversa, ma eliminerebbe tutti i file rimossi e li sostituirà, il che non è così efficiente.

Non puoi farlo da solo.

33
Richard Holloway

Ho scoperto che la seguente soluzione funziona per i miei scopi:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Nota: aggiungere l'opzione -n Per eseguire una prova a secco e non modificare --delete In --delete-excluded!)

L'esecuzione del comando provoca le seguenti proprietà:

  • La directory di origine src rimane non modificata
  • La cartella di destinazione dest corrisponde alla cartella di origine, tranne per il fatto che:

    • gli elementi nell'elenco do_not_send_to_dest non vengono inviati alla destinazione e
    • gli elementi nell'elenco do_not_modify_in_dest vengono lasciati non modificati nella destinazione.
  • (Nota: non è un problema per gli elementi inesistenti essere elencati in uno dei file "do_not_".)

Spiegazione

Immagino che quando rsync legge gli argomenti della riga di comando da sinistra a destra, l'argomento --delete Sembra causare rsync a "cambiare modalità" internamente (in un certo senso), consentendo il secondo uso di --exclude-from opzione di nuovo ma con un significato diverso.

Avvertimento:

  • Se un elemento nell'elenco do_not_send_to_dest Esiste già nella destinazione, allora:

    • questo comando non rimuove l'elemento dalla destinazione (a meno che l'elemento non venga prima rimosso dalla directory di origine)
    • Attenzione: cambiando --delete In --delete-excluded Si cancellerà tutto nella destinazione elencato in uno dei due elenchi. xD (Forse rsync è stato scritto per essere aperto/flessibile, ma ne ha alcuni con sfumature?)

Leggermente testato.

Sto usando "rsync version 3.0.9 protocol version 30".

4
user2533809