Come risincronizzare solo i nuovi file


144

Sto cercando di configurare rsync per sincronizzare il mio server Web principale con il server remoto aggiungendo il file appena generato a quello successivo.

Ecco il comando che uso:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

Ma sembra che il web server trasferisca effettivamente tutti i file nonostante il flag '--update'. Ho provato diverse combinazioni di flag (ad esempio omettendo '-a' e usando invece '-v') ma nessuno mi ha aiutato. Quindi mi chiedo come posso modificare il comando rsync per inviare solo i file appena aggiunti. Grazie


2
Se si desidera sincronizzare i file con il server remoto, non dovrebbe arrivare per ultimo? cioè rsync /foo/bar remoteuser@remotehost:/foo/bar
ostrokach il

Potresti essere interessato a questa pagina web . Inoltre, fai attenzione con il filesystem. Se il filesystem del server non supporta tutto ciò che -aimplica (proprietario, gruppo, permanenti, ...) dovrebbe essere la causa del nostro problema.
ppr

2
Nessuna delle risposte risolve il problema in cui i file locali non sono stati copiati completamente nella destinazione remota e si desidera risincronizzare solo i file più recenti.
Axel Bregnsbo,

Ho appena trovato l' -copzione. Salta i file esistenti in base a un checksum, anziché a tempi o dimensioni di modifica.
haheute,

Risposte:


181

Da man rsync:

--ignore-existing       skip updating files that exist on receiver

--updatefa qualcosa di leggermente diverso, motivo per cui stai ottenendo risultati imprevisti (vedi man rsync):

Questo costringe rsync a saltare tutti i file esistenti sulla destinazione e hanno un orario modificato più recente del file di origine . (Se un file di destinazione esistente ha un tempo di modifica uguale al file di origine, verrà aggiornato se le dimensioni sono diverse.)


1
Bene, in realtà ho provato il comando con '--ignore-esistente' invece di '--aggiornamento'. È terminato rapidamente ma non inserisce i nuovi file nell'host remoto. Qualche idea? Grazie
supermario

13
Le pagine man fanno schifo (è vero che ci sono andato), caso per caso, --ignore-existingsignifica non trasferire file che esistono sul ricevitore, o non trasferire file se sul ricevitore esistono file / cartelle con lo stesso nome?
puk,

7
--update fa saltare i file quando le date di modifica sono identici (che è non è quello che la formulazione implica). Ho provato questo. Credo che la formulazione sarebbe meglio compresa se dicesse "verranno copiati solo i file di origine più recenti della destinazione".
Polpo,

4
@Octopus "verranno copiati solo i file di origine più recenti della destinazione" ... o i file di origine che hanno lo stesso tempo di modifica delle loro controparti dei file di destinazione, ma hanno dimensioni diverse . Penso che sia un punto importante. (Chris lo ha già spiegato, grazie)
Jonathan Komar il

Quindi hai bisogno di --ignore-esistente e -r (ricorsivo). -v (verboso) è bello avere anche :-)
Zio olandese

40

Nel mio caso ho avuto problemi simili, avendo trasferito tutti i file anziché solo quelli modificati / nuovi. Ho risolto questo problema utilizzando i parametri -t(anziché -a) e -P(equivalente a --partial --progress):

rsync -h -v -r -P -t target sorgente

Questo trasferisce solo nuovi file e file già esistenti ma modificati: -afa troppo, come la sincronizzazione dell'ID utente e del gruppo, che nel mio caso non può funzionare poiché ho utenti e gruppi diversi sui miei sistemi di origine e di destinazione.

I parametri in dettaglio:

  • -h: numeri leggibili dall'uomo
  • -v: verboso
  • -r: ricorrere alle directory
  • -P: --partial(conserva i file parzialmente trasferiti) +
            --progress(mostra i progressi durante il trasferimento)
  • -t: preserva i tempi di modifica

2
+1 per "-a fa troppo" (in effetti -rlptgoD, quindi il permesso non viene appiattito, i gruppi e il proprietario vengono conservati - non è il mio tipico backup sicuro per il gioco ...)
Frank Nocke,

2

Dalla mia esperienza con rsync, una copia di una partizione da 1 TB è troppo grande per essere efficiente. Ci vuole rsync per sempre per elaborarlo. Invece, fallo per sottodirectory. Cioè, esegui rsync per ogni sottodirectory principale. Va molto più veloce se non deve destreggiarsi tra decine di migliaia di file.


1
Forse hai esaurito la memoria e il tuo sistema ha iniziato a scambiare?
Marcel Burkhard,

-2

Provare

rsync -zvrt --update SOURCE DESTN

8
Una piccola spiegazione in più al comando sopra sarebbe apprezzata per l'OP.
Peschke,

dalla pagina man `-u, --update salta i file più recenti sul ricevitore`
ShoeLace
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.