rsync: differenza tra --size-only e --ignore-times


114

Sto cercando di capire qual è la differenza tra due opzioni

rsync --size-only

e

rsync --ignore-times

Mi risulta che per impostazione predefinita rsync confronterà sia i timestamp che le dimensioni dei file per decidere se un file deve essere sincronizzato o meno. Le opzioni di cui sopra consentono all'utente di influenzare questo comportamento.

Entrambe le opzioni sembrano, almeno verbalmente, produrre la stessa cosa: confrontare solo per dimensione .

Mi manca qualcosa di sottile qui?


18
Questo probabilmente si adatterebbe meglio su qualcosa come SuperUser.com o Unix.SE , poiché si tratta di utilizzare uno strumento esistente (non correlato alla programmazione) piuttosto che qualsiasi cosa direttamente correlata alla scrittura di codice.
Jerry Coffin

Risposte:


110

Esistono diversi modi in cui rsync confronta i file: la fonte autorevole è la descrizione dell'algoritmo rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Anche l' articolo di wikipedia su rsync è molto buono.

Per i file locali, rsync confronta i metadati e se sembra che non sia necessario copiare il file perché la dimensione e il timestamp corrispondono tra origine e destinazione, non cerca oltre. Se non corrispondono, cp è il file. Tuttavia, cosa succede se i metadati corrispondono ma i file non sono effettivamente gli stessi? Quindi rsync probabilmente non ha fatto quello che volevi.

I file della stessa dimensione potrebbero essere ancora cambiati. Un semplice esempio è un file di testo in cui si corregge un errore di battitura, come cambiare "teh" in "the". La dimensione del file è la stessa, ma il file corretto avrà un timestamp più recente. --size-onlydice "non guardare l'ora; se la dimensione corrisponde, presuppone che i file corrispondano", che in questo caso sarebbe la scelta sbagliata.

D'altra parte, supponiamo di aver fatto accidentalmente un grande cp -r A Bieri, ma di aver dimenticato di conservare i timestamp e ora di voler eseguire l'operazione al contrario rsync B A. Tutti i file che hai copiato hanno il timestamp di ieri, anche se non sono stati realmente modificati ieri, e rsync finirà per copiare tutti quei file e aggiornerà anche il timestamp a ieri. --size-onlypotrebbe essere tuo amico in questo caso (modulo l'esempio sopra).

--ignore-timesdice di confrontare i file indipendentemente dal fatto che i file abbiano lo stesso tempo di modifica. Considera l'esempio di errore di battitura sopra, ma poi non solo hai corretto l'errore di battitura, ma hai usato touchper fare in modo che il file corretto avesse lo stesso tempo di modifica del file originale - diciamo solo che sei subdolo in quel modo. Bene --ignore-timesfarà una differenza dei file anche se la dimensione e il tempo corrispondono.


58

La risposta breve è che --ignore-timesfa più di quanto suggerisce il nome. Ignora sia l'ora che le dimensioni. Al contrario, --size-onlyfa esattamente quello che dice.


La risposta lunga è che rsyncha tre modi per decidere se un file è obsoleto:

  1. Confronta le dimensioni dell'origine e della destinazione.
  2. Confronta il timestamp di origine e destinazione.
  3. Confronta il checksum statico di origine e destinazione.

Questi controlli vengono eseguiti prima del trasferimento dei dati. In particolare, questo significa che il checksum statico è distinto dal checksum del flusso: il successivo viene calcolato durante il trasferimento dei dati.

Per impostazione predefinita, rsyncutilizza solo 1 e 2. Sia 1 che 2 possono essere acquisiti insieme da un singolo stat, mentre 3 richiede la lettura dell'intero file (questo è indipendente dalla lettura del file per il trasferimento). Supponendo che sia specificato un solo modificatore, ciò significa quanto segue:

  • Utilizzando --size-only, viene eseguito solo 1: i timestamp e il checksum vengono ignorati. Un file viene copiato a meno che la sua dimensione non sia identica su entrambe le estremità.

  • Utilizzando --ignore-times, non viene eseguito nessuno di 1, 2 o 3. Un file viene sempre copiato.

  • Utilizzando --checksum, 3 viene utilizzato in aggiunta a 1, ma 2 non viene eseguito. Un file viene copiato a meno che le dimensioni e il checksum non corrispondano. Il checksum viene calcolato solo se la dimensione corrisponde.


1
--checksum è esattamente quello che stavo cercando. Stavo copiando l'output di build che aveva solo il cambio di tempo per la maggior parte dei file. L'aggiunta di --checksum significava che ignorava le differenze di orario ma si assicurava che fossero identiche bit per bit. Era quello che mi aspettavo, ignorando i tempi, grazie per ulteriori informazioni.
Joseph Connolly

50

Ti manca che rsync possa anche confrontare i file tramite checksum.

--size-onlysignifica che rsync salterà i file che corrispondono alla dimensione, anche se i timestamp sono diversi. Ciò significa che sincronizzerà meno file rispetto al comportamento predefinito. Mancherà qualsiasi file con modifiche che non influiscono sulla dimensione complessiva del file. Se hai qualcosa che cambia le date sui file senza cambiare i file e non vuoi che rsync passi molto tempo a fare il checksum di quei file per scoprire che non sono cambiati, questa è l'opzione da usare.

--ignore-timessignifica che rsync eseguirà il checksum di ogni file, anche se i timestamp e le dimensioni dei file corrispondono. Ciò significa che sincronizzerà più file rispetto al comportamento predefinito. Comprenderà le modifiche ai file anche se la dimensione del file è la stessa e la data / ora della modifica è stata ripristinata al valore originale. Il checksum di ogni file significa che deve essere letto interamente dal disco, il che potrebbe essere lento. Alcune pipeline di build reimposteranno i timestamp a una data specifica (come 1970-01-01) per garantire che il file di build finale sia riproducibile bit per bit, ad esempio quando viene impacchettato in un file tar che salva i timestamp.


4
"è improbabile che il ripristino di data / ora venga eseguito in pratica, ma potrebbe accadere" - Ad esempio quando si utilizza un software che, in nome di build riproducibili, reimposta forzatamente ogni file a 1970-01-01 invece della data e momento della creazione / modifica effettiva.

10
In realtà, penso che tu abbia bisogno dell'opzione -c se vuoi usare i checksum. Senza di essa, --ignore-times copierà tutti i file incondizionatamente.
Edward Falk

1
L'opzione -a può sovrascrivere queste opzioni. Nel mio caso stavo usando --compare-dir = e --size-only e ottenevo risultati inaspettati. Cambiare -a in -r ha risolto il problema.
dbagnara

@dbagnara Ho confermato oggi che --size-only "si trova sopra" -a, o "sostituisce" -a. Avevo un disco che per qualsiasi motivo montato con tutti i tempi di modifica aumentati di un mese. Rsync per il backup stava copiando ogni file (con -a ON). L'aggiunta di --size-only ha risolto il problema e ha portato ai risultati desiderati (quindi -a --size-only). Quindi concludo che solo le dimensioni hanno la precedenza sull'archivio.
Tommy

1

Su un sistema Scientific Linux 6.7, la pagina man su rsync dice:

--ignore-times          don't skip files that match size and time

Ho due file con contenuti identici, ma con date di creazione diverse:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

Con --size-only, i due file sono considerati uguali:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

Con --ignore-times, i due file sono considerati diversi:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Quindi sembra che non --ignore-timesabbia alcun effetto.


2
--ignore-timesavrebbe copiato i file anche se i loro timestamp fossero gli stessi.
MisterMiyagi
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.