J'essaie de comprendre la différence entre deux options
rsync --size-only
et
rsync --ignore-times
Je crois comprendre que par défaut, rsync comparera les horodatages et la taille des fichiers afin de décider si un fichier doit ou non être synchronisé. Les options ci-dessus permettent à l'utilisateur d'influencer ce comportement.
Les deux options semblent, du moins verbalement, aboutir à la même chose: comparaison par taille uniquement.
Est-ce que je manque quelque chose de subtil ici?
Rsync compare les fichiers de plusieurs manières. La source faisant autorité est la description de l'algorithme rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Le article de wikipedia sur rsync est également très bon.
Pour les fichiers locaux, rsync compare les métadonnées. S'il semble ne pas avoir besoin de copier le fichier, car la taille et l'horodatage de la source et de la destination ne sont pas plus poussés. 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 les mêmes? Ensuite, rsync n'a probablement pas fait ce que vous vouliez.
Les fichiers de même taille peuvent encore avoir été modifiés. Un exemple simple est un fichier texte dans lequel vous corrigez une faute de frappe, comme si vous changiez "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 les tailles correspondent, supposons que les fichiers correspondent", ce qui serait un mauvais choix dans ce cas.
D'autre part, supposons que vous ayez accidentellement fait un gros "cp -r A B" hier, mais que vous ayez oublié de conserver les horodatages et que vous souhaitiez maintenant effectuer l'opération en sens inverse "rsync B A". Tous les fichiers que vous avez enregistrés ont l'horodatage d'hier, même s'ils n'ont pas été vraiment modifiés hier, et rsync finira par copier tous ces fichiers et mettre à jour l'horodatage sur hier également. --size-only peut être votre ami dans ce cas (modulo l'exemple ci-dessus).
--ignore-times indique de comparer les fichiers, que les fichiers aient le même temps de modification ou non. Prenons l'exemple de typo ci-dessus, mais vous avez non seulement corrigé la typo, mais vous avez également 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. Bien --ignore-times fera un diff des fichiers même si la taille et l'heure correspondent.
Il vous manque que rsync puisse é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 contenant des modifications n'affectant pas la taille globale du fichier. Si quelque chose modifie les dates des fichiers sans changer de fichier et que vous ne voulez pas que rsync passe beaucoup de temps à contrôler ces fichiers afin de découvrir qu'ils n'ont pas changé, utilisez cette option.
--ignore-times
signifie que rsync contrôlera 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 identique et que la date/heure de modification a été réinitialisée à sa valeur d'origine. La vérification de chaque fichier signifie qu'il doit être entièrement lu à partir du disque, ce qui peut être lent. Certains pipelines de construction réinitialiseront les horodatages à une date spécifique (comme le 01/07/1970) pour garantir que le fichier de construction final est reproductible bit par bit, par exemple. emballé dans un fichier tar enregistrant les horodatages.
La réponse courte est que --ignore-times
fait plus que son nom ne l'indique. Il ignore les deux l'heure et la taille. En revanche, --size-only
fait exactement ce que cela dit.
La réponse longue est que rsync
dispose de trois méthodes pour décider si un fichier est obsolète:
Ces vérifications sont effectuées avant de transférer des données. Cela signifie notamment que la somme de contrôle statique est distincte de la somme de contrôle de flux - la dernière est calculée lors du transfert de données.
Par défaut, rsync
n'utilise que 1 et 2. Les 1 et 2 peuvent être acquis ensemble par un seul stat
, alors que 3 nécessite la lecture de l'intégralité du fichier (ceci est indépendant de la lecture du fichier pour le transfert. ). En supposant qu'un seul modificateur est spécifié, cela signifie que:
En utilisant --size-only
, seul 1 est effectué - les horodatages et les totaux 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 et 3 n’est exécuté. Un fichier est toujours copié.
En utilisant --checksum
, 3 est utilisé dans addition à 1, mais 2 est non 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.
Sur un système Scientific Linux 6.7, la page de manuel de rsync indique:
--ignore-times don't skip files that match size and time
J'ai deux fichiers avec un contenu identique, 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 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, cela ne ressemble pas à --ignore-times
n'a aucun effet.