2011-10-12 11 views
8

Can Rsync può essere configurato per verificare il contenuto del file prima di essere sincronizzato. Ho sentito parlare del checksum, ma sono venuto a sapere che il checksum fa solo un campionamento. Voglio trasferire un file solo se è cambiato il contenuto e non il timestamp, c'è un modo per farlo con una qualsiasi delle modalità rsync. Nel mio scenario, supponiamo che il file sample.text verrà creato ogni settimana e desidero sincronizzarlo con un server remoto solo se i contenuti di sample.text vengono modificati, poiché viene creato ogni settimana, il timestamp ovviamente cambierà. Ma voglio il trasferimento solo su una modifica del contenuto.Can rsync verifica i contenuti prima di sincronizzare

+0

Hai provato la pagina di manuale di rsync? -c, --checksum Questo cambia il modo in cui rsync controlla se i file sono stati modificati e hanno bisogno di un trasferimento. Senza questa opzione, rsync usa un "controllo rapido" che (per impostazione predefinita) controlla se le dimensioni e il tempo dell'ultima modifica di ciascun file corrispondono tra il mittente e il destinatario. –

risposta

23

Sì, dovresti leggere il manuale.

$ man rsync | grep "\--checksum" 
    -c, --checksum    skip based on checksum, not mod-time & size 

Rsync è piuttosto complicato. Raccomando di coccolare il tempo con la pagina man e la sperimentazione con i dati del test prima di usarlo per qualcosa di remoto importante.

Nella maggior parte dei casi, le persone utilizzano rsync -ac source dest.

$ man rsync | grep "\--archive" 
-a, --archive    archive mode; same as -rlptgoD (no -H) 

E questo -rlptgoD spazzatura significa: recursive, copy symlinks as symlinks, preserve permissions, preserve times, preserve group, preserve owner, preserve device files (super-user only), preserve special files, e skip based on checksum, not mod-time & size

Il -c o --checksum è davvero quello che stai cercando, e la vostra supposizione che campiona solo mtime e la dimensione è sbagliata.

+3

+ per _cuddle time con la pagina man e sperimentazione con dati di test_ - Ottimo consiglio –

8

Vedere l'opzione --checksum nella pagina man rsync.

Inoltre, l'opzione --size-only sarà una scelta più rapida se si è sicuri che un cambiamento di contenuto comporta anche un cambiamento di dimensioni.

0

Esempio:

#!/bin/bash 
echo > diff.txt 
rsync -rvcn --delete /source/ /destination/ > diff.txt 
second_row=$(sed -n '2p' diff.txt) 
if [ "$second_row" = "" ]; then 
    echo there was no change 
else 
    echo there was change 
fi 
+1

Dovresti davvero aggiungere qualche spiegazione sul perché questo codice dovrebbe funzionare - puoi anche aggiungere commenti nel codice stesso - nella sua forma attuale, lo fa non fornire alcuna spiegazione che possa aiutare il resto della comunità a capire cosa hai fatto per risolvere/rispondere alla domanda. – ishmaelMakitla

+0

Se non ci sono stati cambiamenti, la seconda riga di diff.txt in modalità dettagliata di rsync è vuota, sed esamina questa seconda riga. – oldbowman

Problemi correlati