Come posso fare in modo che rsync elimini i file che sono stati eliminati dalla cartella di origine?


194

Di recente ho installato una macchina con Ubuntu Server per ospitare server di gioco. Ho installato un plug-in di backup per ciascun server di gioco che crea backup frequenti dei file del mondo di gioco in una cartella specifica sulla macchina. Ho anche stabilito cronun'attività per copiare automaticamente quei backup nella mia cartella Dropbox ogni notte usando rsync con l' -aopzione.

Dopo alcuni mesi il mio account Dropbox ha raggiunto il limite di archiviazione e mi sono reso conto che non sarei stato in grado di conservare così tanti backup, quindi ho configurato il plug-in di backup del server di gioco per non conservare così tanti backup, quindi ho aspettato qualche giorno per vedere se sarebbe elimina i backup più vecchi come è programmato per fare su base settimanale. Il plug-in di backup alla fine ha fatto il suo lavoro ed eliminato i backup più vecchi, quindi mi aspettavo che l' rsyncattività cron eliminasse successivamente i backup più vecchi dalla mia cartella Dropbox affinché corrispondessero alla cartella di origine, ma non lo ha fatto. Quindi ho un paio di domande:

  • Per impostazione predefinita, aggiungersync solo i file nella cartella di destinazione che sono stati aggiunti alla cartella di origine e modifica i file che sono stati modificati nella cartella di origine ma NON elimina i file che sono stati eliminati dalla cartella di origine?

  • In tal caso, qual è il modo migliore per rsyncfarlo? Voglio che la cartella di destinazione rifletta perfettamente la cartella di origine, e ciò significa eliminare tutti i file che sono stati eliminati dalla cartella di origine.

Vedo alcune opzioni elencate nella pagina di manuale per rsyncquesto potrebbe fare il trucco, ma dal momento che non ho familiarità.

Risposte:


227

Per eliminare i file nella destinazione, aggiungi l' --deleteopzione al tuo comando. Per esempio:

rsync -avh source/ dest/ --delete

15
Assicurarsi che l'origine sia una directory. L'uso source/* dest/non funzionerà.
Tom Saleeba,

3
Ho trovato quell'evento con --deleteo --delete-afternon verrà eliminato a causa di alcuni errori: "Errore di IO rilevato - saltando la cancellazione del file". Per risolvere questa --ignore-errorsopzione di aggiunta ed eseguire il debug degli errori separatamente
MHT

12
Funziona perfettamente! Anche se funziona, consiglierei SEMPRE di utilizzare l' -n, --dry-runopzione, prima di eseguire rsync, specialmente quando si tratta di opzioni come queste ( --delete). Eviterà ogni possibile mal di testa :).
Ivanleoncz,

2
@MHT: nessuna risposta sembra completa senza il tuo commento.
Lonnie Best

2
@TheBicentennialMan -a implica -r .
X-Yuri,

45

Il comando rsync non eliminerà alcun file mentre si utilizzano alcune delle sue opzioni deletein quel comando. Quindi, se un file o una cartella vengono aggiunti all'origine, verranno sincronizzati con la destinazione senza alcuna eliminazione.

Ti suggerisco di utilizzare rsyncper eseguire il backup dai file di origine e utilizzare find ... rmper i file di eliminazione per il periodo di tempo o la dimensione dei file:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Il blocco di codice sopra riportato esegue un backup dall'origine e quindi elimina tutti i file che sono stati modificati per l'ultima volta più di 2 mesi.

AGGIORNARE

Come ho scoperto che le deleteopzioni sono solo per TARGET che se alcuni file vengono rimossi dall'origine, rsync --deleterimuoverli da TARGET. E l' deleteopzione di aftere before, come menzionato nella sua pagina man:

--delete-before         receiver deletes before transfer, not during

Significa che:

  1. rsync elimina il file da TARGET che viene rimosso da SOURCE.
  2. rsync inizia a sincronizzare i file.

--delete-after receiver deletes after transfer, not during

Significa che:

  1. rsync inizia a sincronizzare i file.
  2. rsync elimina il file da TARGET che viene rimosso da SOURCE dopo la sincronizzazione.

NOTA : l' --delete-{before/after}attrezzo giusto in TARGET.


1
Grazie per la risposta!! Ti riferisci a un'opzione "elimina" per rsync? Perché non posso semplicemente usare l'opzione "elimina" per rsync?
user254251

@ user254251, Se si utilizza delete, il comando rsync elimina immediatamente i file. Ma in questo caso c'è più tempo per eventuali errori.
shgnInc,

Se ho capito bene, stai dicendo che dovrei separare l'attività di eliminazione dall'attività rsync per evitare errori. Ho una domanda, però. La pagina di manuale per rsync elenca alcune opzioni che sembrano servire allo scopo di separare l'attività di cancellazione eseguendola prima o dopo l'attività di copia. Ad esempio, vedo due opzioni chiamate --delete-before e --delete-after. Rsync con queste opzioni avrebbe lo stesso effetto del metodo che hai descritto? Ho letto la descrizione completa di ciascuna opzione nella pagina del manuale ma ci sono alcune informazioni nelle descrizioni che non capisco.
user254251

@ user254251, la risposta è stata aggiornata. Non so se esiste un modo per eliminare i file da TARGET con un limite di tempo in rsync .
shgnInc,

Grazie! Quindi pensi che io sia al sicuro da errori se uso semplicemente l'opzione --delete-before? Non sto specificando un timeout, quindi non dovrei preoccuparmi se la fase di cancellazione rsync ritarda la fase di trasferimento. rsync viene eseguito una volta al giorno e questo è un sacco di tempo per sincronizzare i file di backup prima della sincronizzazione successiva, quindi non dovrei aver bisogno di limitare il tempo neanche la sincronizzazione.
user254251

6

Questo comando copia i dati di incremento e li mantiene sincronizzati con il server remoto.

  1. Copia solo i dati incrementali.
  2. Eliminerà se i dati vengono eliminati dalla fonte.
  3. Copierà nuovamente dalla fonte se tutti i dati cancellati a destinazione.
  4. fondamentalmente questo comando manterrà sincronizzati entrambi gli ambienti.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Esempio:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
Penso che -W non consenta di copiare solo dati incrementali ma di copiare sempre interi file.
Tulains Córdova,

Ho riscontrato questo errore eseguendo questo comando: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Se ci sono errori nel corso di uno scync rsync, rsync non elimina correttamente i file che dovrebbe avere, anche se si è utilizzato --delete, --delete-aftero --delete-before.

Ecco perché è importante affrontare gli errori rsync.

La maggior parte dei miei errori era dovuta all'uso --permsdell'opzione durante la sincronizzazione con un file system non Linux. Quando ho sostituito --permscon --no-perms, quegli errori sono andati via e quindi l'eliminazione ha funzionato.

--permsva bene quando si esegue la sincronizzazione da un file system Linux a un altro file system Linux, ma se si esegue la sincronizzazione da Linux a un file system non Linux (come NTFS, FAT), si verificano --permserrori perché rsync non può impostare le autorizzazioni Linux su un file system non Linux . Ancora una volta, errori = nessuna eliminazione.

- Durante la sincronizzazione di una partizione non-Linux, io uso --no-permsper evitare quegli errori che il sabotaggio --delete, --delete-aftero --delete-before.

Se dopo ricevi ancora errori e non riesci a capire come farli passare, puoi eseguire un comando dedicato esclusivamente all'eliminazione dei file non sincronizzati:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

Il comando sopra cancellerà cose che non sono sincronizzate, ma non sincronizzerà alcun file. Quindi, dovresti sincronizzare di nuovo dopo questo. Questo comando si basa su questa risposta , tranne per il fatto che ho aggiunto anche l' --ignore-errorsargomento, quindi eliminerebbe anche se ci fossero errori.


1
Grazie per il consiglio! Sono l'autore originale di questa domanda 5 anni fa. Sono davvero contento che tu l'abbia pubblicato, perché ho intenzione di configurare la sincronizzazione con un'unità NTFS nel prossimo futuro, e probabilmente mi sarei imbattuto nell'errore di permessi perché stavo pianificando di usare l'opzione "-a" per rsync, che sincronizza le autorizzazioni (tra le altre cose). Quindi ho aggiunto "--no-perms" alle mie note. Ora ho intenzione di usare rsync -a --no-perms --delete-before. Ho una domanda: --delete-before non eviterebbe problemi con la cancellazione dei file eseguendo la cancellazione prima della sincronizzazione? Ho pensato che quello fosse il suo scopo.
user254251

@ user254251 - Non ne sono certo. Immagino che dipenda da quanto presto "cancella prima". Se in qualche modo incontra un errore prima dell'inizio dell'eliminazione, sei fregato. Il mio consiglio è di evitare NTFS ogni volta che puoi a meno che non ti piaccia il dolore acuto nel culo :). Da NTFS a NTFS funziona bene. Da NTFS a Linix funziona bene. Evitare "File system Linux" in "File system non Linux"; è troppo doloroso assicurarsi che l'eliminazione funzioni correttamente. È possibile eseguire questa operazione, ma ho deciso che non vale la pena rispetto alla sola formattazione dell'unità di destinazione come EXT4.
Lonnie Best
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.