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?
Réponses:
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-only
dit "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 B
hier, mais que vous ayez oublié de conserver les horodatages, et maintenant vous voulez faire l'opération en sens inversersync 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-only
peut être votre ami dans ce cas (modulo l'exemple ci-dessus).--ignore-times
dit 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étouch
pour 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-times
fera une différence des fichiers même si la taille et l'heure correspondent.la source
La réponse courte est que cela
--ignore-times
fait plus que son nom l'indique. Il ignore à la fois l'heure et la taille. En revanche,--size-only
fait exactement ce qu'il dit.La réponse longue est qu'il
rsync
existe trois façons de décider si un fichier est obsolète: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,
rsync
utilise seulement 1 et 2. Les deux 1 et 2 peuvent être acquis ensemble par un seulstat
, 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.la source
Il vous manque que rsync peut également comparer les fichiers par somme de contrôle.
--size-only
signifie 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-times
signifie 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.la source
Sur un système Scientific Linux 6.7, la page de manuel sur rsync dit:
J'ai deux fichiers avec des contenus identiques, mais avec des dates de création différentes:
Avec
--size-only
, les deux fichiers sont considérés comme identiques:Avec
--ignore-times
, les deux fichiers sont considérés comme différents:Donc ça ne semble pas du tout
--ignore-times
avoir d'effet.la source
--ignore-times
aurait copié les fichiers même si leurs horodatages étaient les mêmes.