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


29

Ho letto questi thread:

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

Come si chiede rsyncdi copiare file ed eliminare quelli sul lato di ricezione che non esistono sul lato di invio, con eccezioni? (ad es. non rimuovere un repository mercuriale .hgsul lato ricevente, anche se non esiste un repository sul lato mittente).

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 rsynccancellare tutto sul percorso di ricezione che non esiste sul percorso di invio, tranne quelle corrispondenti dont_delete_me. La mia domanda ora è: rsync manterrebbe i file sul lato ricevente corrispondenti dont_delete_me anche se nulla sul lato di invio corrisponde dont_delete_me?

Risposte:


33

Se si utilizza --deletee --excludeinsieme 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à rsyncaffatto. Quindi avrai bisogno di un altro rsynclavoro in syncquella 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.


Grazie @Richard. La tua risposta mi sta facendo pensare che la mia domanda originale potrebbe essere stata più semplice di quanto pensassi. Se uso la riga singola: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathnon rsynceliminerei tutto sul percorso di ricezione che non esiste sul percorso di invio, tranne le cose corrispondenti dont_delete_me? Ancora più importante, rsyncmanterrebbero le cose sul lato ricevente abbinate dont_delete_me anche se nulla sul lato mittente corrispondedont_delete_me ? Se è così, penso che sia l'unica linea di cui ho bisogno, giusto?
Amelio Vazquez-Reina,

Hai ragione, ma non otterrai anche nuovi file e modifiche alla cartella dont_delete_me se lo fai in una riga. Se non vuoi sincronizzare modifiche e aggiunte, puoi semplicemente usare il flag --exclude come descritto qui.
Richard Holloway, l'

@AmV I file esclusi non vengono eliminati da --delete, a meno che non venga specificato esplicitamente --delete-excluded. Vedere la descrizione di --deletee --delete-excludednel manuale di rsync.
Gilles 'SO- smetti di essere malvagio' l'

4

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' -nopzione per eseguire una corsa a secco e non passare --deletea --delete-excluded!)

L'esecuzione del comando provoca le seguenti proprietà:

  • La srcdirectory di origine rimane non modificata
  • La destcartella di destinazione corrisponde alla cartella di origine tranne che:

    • gli elementi do_not_send_to_destnell'elenco non vengono inviati alla destinazione e
    • gli elementi do_not_modify_in_destnell'elenco vengono lasciati non modificati nella destinazione.
  • (Nota: non è un problema per gli elementi inesistenti essere elencati in uno dei do_not_file " ".)

Spiegazione

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

Avvertimento:

  • Se un elemento do_not_send_to_destnell'elenco esiste già nella destinazione, allora:

    • questo comando non rimuove quell'elemento dalla destinazione (a meno che l'elemento non venga prima rimosso dalla directory di origine)
    • Attenzione: la modifica --deletein --delete-excludedeliminerà tutto ciò che è elencato nella destinazione in uno dei due elenchi. xD (Forse rsync è stato scritto per essere aperto / flessibile, ma ha alcune sfumature?)

Leggermente testato.

Sto usando " rsync version 3.0.9 protocol version 30".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.