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
risposta
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.
+ per _cuddle time con la pagina man e sperimentazione con dati di test_ - Ottimo consiglio –
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.
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
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
Se non ci sono stati cambiamenti, la seconda riga di diff.txt in modalità dettagliata di rsync è vuota, sed esamina questa seconda riga. – oldbowman
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. –