rsync: différence entre --size-only et --ignore-times

114

J'essaye de comprendre quelle est la différence entre deux options

rsync --size-only

et

rsync --ignore-times

Je crois comprendre que par défaut, rsync comparera à la fois les horodatages et les tailles de fichiers afin de décider si un fichier doit être synchronisé ou non. Les options ci-dessus permettent à l'utilisateur d'influencer ce comportement.

Les deux options semblent, au moins verbalement, aboutir au même résultat: comparer uniquement par taille .

Est-ce que je rate quelque chose de subtil ici?

alfred_j_kwack
la source
18
Cela conviendrait probablement mieux à quelque chose comme SuperUser.com ou Unix.SE , car il s'agit d'utiliser un outil existant (non lié à la programmation) plutôt que tout ce qui est directement lié à l'écriture de code.
Jerry Coffin

Réponses:

110

Il existe plusieurs façons dont rsync compare les fichiers - la source faisant autorité est la description de l'algorithme rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . L' article de wikipedia sur rsync est également très bon.

Pour les fichiers locaux, rsync compare les métadonnées et s'il semble qu'il n'a pas besoin de copier le fichier car la taille et l'horodatage correspondent entre la source et la destination, il ne cherche pas plus loin. S'ils ne correspondent pas, cp est le fichier. Cependant, que se passe-t-il si les métadonnées correspondent mais que les fichiers ne sont pas réellement les mêmes? Ensuite, rsync n'a probablement pas fait ce que vous vouliez.

Les fichiers de même taille peuvent encore avoir changé. Un exemple simple est un fichier texte dans lequel vous corrigez une faute de frappe - comme changer "teh" en "the". La taille du fichier est la même, mais le fichier corrigé aura un horodatage plus récent. --size-onlydit "ne regardez pas l'heure; si la taille correspond, supposez que les fichiers correspondent", ce qui serait un mauvais choix dans ce cas.

D'un autre côté, supposons que vous ayez accidentellement fait un gros travail cp -r A Bhier, mais que vous ayez oublié de conserver les horodatages, et maintenant vous voulez faire l'opération en sens inverse rsync B A. Tous ces fichiers que vous avez cpés ont l'horodatage d'hier, même s'ils n'ont pas vraiment été modifiés hier, et rsync finira par défaut par copier tous ces fichiers et par la mise à jour de l'horodatage d'hier également. --size-onlypeut être votre ami dans ce cas (modulo l'exemple ci-dessus).

--ignore-timesdit de comparer les fichiers indépendamment du fait que les fichiers aient le même temps de modification. Considérez l'exemple de faute de frappe ci-dessus, mais non seulement vous avez corrigé la faute de frappe, mais vous avez utilisé touchpour que le fichier corrigé ait le même temps de modification que le fichier d'origine - disons simplement que vous êtes sournois de cette façon. Eh bien, --ignore-timesfera une différence des fichiers même si la taille et l'heure correspondent.

ckg
la source
58

La réponse courte est que cela --ignore-timesfait plus que son nom l'indique. Il ignore à la fois l'heure et la taille. En revanche, --size-onlyfait exactement ce qu'il dit.


La réponse longue est qu'il rsyncexiste trois façons de décider si un fichier est obsolète:

  1. Comparez la taille de la source et de la destination.
  2. Comparez l'horodatage de la source et de la destination.
  3. Comparez la somme de contrôle statique de la source et de la destination.

Ces vérifications sont effectuées avant le transfert des données. Cela signifie notamment que la somme de contrôle statique est distincte de la somme de contrôle du flux - la dernière est calculée lors du transfert des données.

Par défaut, rsyncutilise seulement 1 et 2. Les deux 1 et 2 peuvent être acquis ensemble par un seul stat, tandis que 3 nécessite la lecture du fichier entier (ceci est indépendant de la lecture du fichier pour le transfert). En supposant qu'un seul modificateur est spécifié, cela signifie ce qui suit:

  • En utilisant --size-only, seul 1 est effectué - les horodatages et la somme de contrôle sont ignorés. Un fichier est copié sauf si sa taille est identique aux deux extrémités.

  • En utilisant --ignore-times, aucun des 1, 2 ou 3 n'est effectué. Un fichier est toujours copié.

  • En utilisant --checksum, 3 est utilisé en plus de 1, mais 2 n'est pas exécuté. Un fichier est copié sauf si la taille et la somme de contrôle correspondent. La somme de contrôle n'est calculée que si la taille correspond.

MonsieurMiyagi
la source
1
--checksum est exactement ce que je recherchais. Je copiais la sortie de construction qui n'avait le changement d'heure que pour la plupart des fichiers. L'ajout de --checksum signifiait qu'il ignorait les différences de temps, mais s'assurait qu'ils étaient identiques petit à petit. C'était ce à quoi je m'attendais - ignore-times de le faire alors merci pour plus d'informations.
Joseph Connolly
50

Il vous manque que rsync peut également comparer les fichiers par somme de contrôle.

--size-onlysignifie que rsync ignorera les fichiers dont la taille correspond, même si les horodatages diffèrent. Cela signifie qu'il synchronisera moins de fichiers que le comportement par défaut. Il manquera tout fichier avec des modifications qui n'affectent pas la taille globale du fichier. Si vous avez quelque chose qui change les dates sur les fichiers sans changer les fichiers, et que vous ne voulez pas que rsync passe beaucoup de temps à faire la somme de ces fichiers pour découvrir qu'ils n'ont pas changé, c'est l'option à utiliser.

--ignore-timessignifie que rsync effectuera la somme de contrôle de chaque fichier, même si les horodatages et les tailles de fichier correspondent. Cela signifie qu'il synchronisera plus de fichiers que le comportement par défaut. Il inclura les modifications apportées aux fichiers même lorsque la taille du fichier est la même et que la date / heure de modification a été réinitialisée à la valeur d'origine. La somme de contrôle de chaque fichier signifie qu'il doit être entièrement lu à partir du disque, ce qui peut être lent. Certains pipelines de construction réinitialisent les horodatages à une date spécifique (comme 1970-01-01) pour s'assurer que le fichier de construction final est reproductible bit pour bit, par exemple lorsqu'il est compressé dans un fichier tar qui enregistre les horodatages.

rjmunro
la source
4
"il est peu probable que la réinitialisation de la date / heure soit effectuée dans la pratique, mais cela pourrait arriver" - Par exemple, lors de l'utilisation d'un logiciel qui, au nom de constructions reproductibles, réinitialise de force chaque fichier au 01/01/1970 au lieu de la date et heure de la création / modification réelle.
10
En fait, je pense que vous avez besoin de l'option -c si vous voulez que les sommes de contrôle soient utilisées. Sans cela, --ignore-times copiera tous les fichiers sans condition.
Edward Falk
1
L'option -a peut remplacer ces options. Dans mon cas, j'utilisais --compare-dir = et --size-only et j'obtenais des résultats inattendus. Changer -a en -r a résolu le problème.
dbagnara
@dbagnara J'ai confirmé aujourd'hui que --size-only "se trouve au-dessus de" -a, ou "overrides" -a. J'avais un lecteur qui, pour une raison quelconque, était monté avec tous les temps de modification augmentés d'un mois. Rsync to backup copiait chaque fichier (avec -a ON). L'ajout de --size-only a résolu le problème et conduit aux résultats souhaités (donc -a --size-only). Je conclus donc que la taille uniquement remplace l'archive.
Tommy le
1

Sur un système Scientific Linux 6.7, la page de manuel sur rsync dit:

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

J'ai deux fichiers avec des contenus identiques, mais avec des dates de création différentes:

[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

Avec --size-only, les deux fichiers sont considérés comme identiques:

[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)

Avec --ignore-times, les deux fichiers sont considérés comme différents:

[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)

Donc ça ne semble pas du tout --ignore-timesavoir d'effet.

Peter Chiu
la source
2
--ignore-timesaurait copié les fichiers même si leurs horodatages étaient les mêmes.
MisterMiyagi