In che modo rsync decide esattamente cosa sincronizzare?


14

Sto trovando più risposte alla domanda, quindi volevo chiedere alle persone che lo usano effettivamente, piuttosto che voler solo creare il blog più grande compilando informazioni semi casuali inutili.

Scenario: io rsync -av --progress /dir/a /dir/b e fa la sua cosa.

Aggiungo nuovi file a / dir / a ed eseguo di nuovo lo stesso comando, sa cosa ha fatto e copia solo i nuovi file.

Aggiungo nuovi file a / dir / a e rinominare alcuni file in / dir / b, e forse ne elimino anche alcuni.

Se corro di rsync -av --progress /dir/a /dir/bnuovo, cosa verrà copiato? Solo i nuovi file perché sanno cosa è stato precedentemente copiato, o anche i file che sono stati rinominati / eliminati, perché non sono più presenti.

E come bonus, se i file precedentemente copiati vengono nuovamente copiati, c'è un modo per impedirlo, in modo che vengano copiate solo le nuove aggiunte a / dir / a?

Al momento sono contento di controllare manualmente le cose, ma man mano che i dati diventano più grandi avrò bisogno di più automazione per eseguire questo compito.


3
La -ibandiera è molto utile. Per ogni file, fornisce una stringa di corrispondenza che può essere decodificata per vedere il motivo della corrispondenza (flag per ora mod, flag per dimensione, ecc.)
BowlOfRed

Risposte:


17

Aggiungo nuovi file a / dir / a ed eseguo di nuovo lo stesso comando, sa cosa ha fatto e copia solo i nuovi file.

No, non sa cosa ha fatto in una corsa precedente. Confronta i dati sul lato ricevente con i dati da inviare. Con dati abbastanza piccoli, questo non sarà evidente, ma quando si dispone di directory abbastanza grandi, il tempo impiegato per il confronto prima dell'inizio della copia viene facilmente percepito.

Il controllo predefinito è per tempi e dimensioni di modifica del file. Da man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

E:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Nota che queste non sono implicite dalle opzioni che hai usato. -aè:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

Migliore descrizione che ho visto (finora), grazie
SPooKYiNeSS,

2
Una piccola aggiunta. I file rinominati vengono trattati come file univoci su entrambe le estremità. Se specifichi --fuzzyuna volta, li riconoscerai come uguali nella stessa directory. L'utilizzo --fuzzydue volte espande questa capacità in altre posizioni. Vedi man rsyncper i dettagli. Naturalmente, uno dei motivi principali per l'utilizzo rsyncè la sua capacità di copiare solo le parti di un file che sono state modificate. Questo può rendere i trasferimenti su una rete molto più veloce. A proposito, l'opzione di checksum è menzionata sopra per la sua spiegazione di come rsyncfunziona. Nella maggior parte dei casi, non dovrebbe essere usato.
Joe,

6

Generale

Se ho capito bene, rsync -avnon ha memoria, quindi copierà anche i file che sono stati rinominati / eliminati, perché sono presenti nella fonte ma non più presenti nella destinazione.

Suggerimenti

  • Utilizzare l'opzione -n"esecuzione a secco" per verificare cosa succede prima di eseguire la rsyncriga di comando.

  • Notare il significato speciale di una barra finale dopo la directory di origine e vedere la differenza tra

    rsync -av --progress dir/a/ dir/b
    

    e

    rsync -av --progress dir/a dir/b
    

    che è descritto nel manuale man rsync.

Esempio

Il tuo caso speciale (aggiungendo un file alla directory di origine 'a' e rimuovendo un file dalla directory di destinazione 'b') aggiungerà sia il file aggiunto che il file precedentemente copiato, perché è ancora nella directory di origine. Questo accadrà sia con che senza l'opzione -ue non conosco alcuna opzione rsyncper risolverlo facilmente, se vuoi tenerlo nella directory di origine.

Ma puoi rimuoverlo dalla directory di origine o inserire il nome del file nel file excludede utilizzare l'opzione --exclude-from=excluded(per molti file) o semplicemente --exclude=PATTERNper uno o pochi file.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternativa: unison

Potresti voler testare lo strumento unison, che è uno strumento di sincronizzazione . Fornisce un metodo visivo per identificare casi speciali e decidere cosa fare. Esiste una versione della GUI ( unison-gtk).


Bei esempi grazie.
Conoscevo

E ancora invia prima che io abbia finito e non mi permetta di modificare il mio commento ... Copiato / incollato il secondo. Dò un'occhiata a insolon e vedrò se può fare quello che voglio, e in caso contrario tornerò al piano b e
realizzerò

Uso unison-gtkda diversi anni e ne sono contento. (Uso rsyncanche io .)
sudodus,

1

Copia solo i nuovi file in / dir / a. Qualunque cosa tu faccia in / dir / b verrà ignorata, a meno che tu non usi l'opzione --delete. In tal caso, i file rinominati in / dir / b verranno eliminati. Forzerà / dir / b a diventare esattamente come / dir / a.

Per quanto riguarda il bonus, intendi come nel caso di rinominare i file in / dir / a, e quindi risincronizzare in / dir / b? Non penso che ci sia un modo per impedire a rsync di copiare nuovamente i file in quel caso.


Non mi aspettavo che ci fosse un modo, oltre all'utilizzo di un attributo per determinare, ma poi se avrei realizzato uno script per bambini e ne avremmo più bisogno. Grazie per la tua risposta, almeno ora so cosa devo fare.
SPooKYiNeSS,
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.