Comment rsync décide-t-il exactement quoi synchroniser?

15

Je trouve plusieurs réponses à la question, je voulais donc demander aux personnes qui l'utilisent réellement, plutôt que de simplement créer le plus grand blog en remplissant des informations aléatoires semi-inutiles.

Scénario: moi rsync -av --progress /dir/a /dir/b et ça fait son truc.

J'ajoute de nouveaux fichiers à / dir / a et j'exécute à nouveau la même commande, il sait ce qu'il a fait et ne copie que les nouveaux fichiers.

J'ajoute de nouveaux fichiers dans / dir / a et je renomme certains fichiers dans / dir / b, et j'en supprime peut-être aussi quelques-uns.

Si je cours à rsync -av --progress /dir/a /dir/bnouveau, qu'est-ce qui sera copié? Juste les nouveaux fichiers car il sait ce qu'ils ont déjà copié, ou les fichiers qui ont été renommés / supprimés aussi, car ils ne sont plus présents.

Et en prime, si les fichiers précédemment copiés sont à nouveau copiés, existe-t-il un moyen d'empêcher cela, de sorte que seuls les nouveaux ajouts à / dir / a soient copiés?

Pour le moment, je suis heureux de vérifier les choses manuellement, mais à mesure que les données augmentent, je vais avoir besoin de plus d'automatisation pour effectuer cette tâche.

SPooKYiNeSS
la source
3
Le -idrapeau est très pratique. Pour chaque fichier, il donne une chaîne de correspondance qui peut être décodée pour voir pourquoi elle correspond (indicateur pour l'heure du mod, indicateur pour la taille, etc.)
BowlOfRed

Réponses:

17

J'ajoute de nouveaux fichiers à / dir / a et j'exécute à nouveau la même commande, il sait ce qu'il a fait et ne copie que les nouveaux fichiers.

Non, il ne sait pas ce qu'il a fait lors d'une précédente exécution. Il compare les données côté réception avec les données à envoyer. Avec des données suffisamment petites, cela ne sera pas apparent, mais lorsque vous avez des répertoires suffisamment grands, le temps passé à comparer avant le début de la copie se fait facilement sentir.

La vérification par défaut concerne les heures et les tailles de modification des fichiers. De man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

Et:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Notez que ces options ne sont pas impliquées par les options que vous avez utilisées. -aest:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times
muru
la source
Meilleure description que j'ai vue (jusqu'à présent), merci
SPooKYiNeSS
2
Un petit ajout. Les fichiers renommés sont traités comme des fichiers uniques à chaque extrémité. Spécifier --fuzzyune fois les reconnaîtra comme les mêmes dans le même répertoire. L'utilisation de --fuzzydeux fois étend cette capacité à d'autres emplacements. Voir man rsyncpour plus de détails. Bien sûr, l'une des principales raisons de l'utilisation rsyncest sa capacité à copier uniquement les parties d'un fichier qui ont changé. Cela peut rendre les transferts sur un réseau beaucoup plus rapides. BTW, l'option checksum est mentionnée ci-dessus pour son explication du rsyncfonctionnement. Dans la plupart des cas, il ne doit pas être utilisé.
Joe
6

Général

Si je comprends bien, rsync -avn'a pas de mémoire, il va donc copier les fichiers qui ont été renommés / supprimés aussi, car ils sont présents dans la source mais plus dans la cible.

Conseils

  • Utilisez l'option -n«dry run» pour vérifier ce qui se passe avant d'exécuter votre rsyncligne de commande.

  • Notez la signification particulière d'une barre oblique de fin après le répertoire source et voyez la différence entre

    rsync -av --progress dir/a/ dir/b
    

    et

    rsync -av --progress dir/a dir/b
    

    qui est décrit dans le manuel man rsync.

Exemple

Votre cas particulier (ajouter un fichier au répertoire source 'a' et supprimer un fichier du répertoire cible 'b') ajoutera à la fois le fichier ajouté et le fichier précédemment copié, car il se trouve toujours dans le répertoire source. Cela se produira à la fois avec et sans l'option -uet je ne connais aucune option rsyncpour résoudre ce problème facilement, si vous souhaitez le conserver dans le répertoire source.

Mais vous pouvez le supprimer du répertoire source ou mettre le nom du fichier dans le fichier excludedet utiliser l'option --exclude-from=excluded(pour de nombreux fichiers) ou simplement --exclude=PATTERNpour un ou quelques fichiers.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternative: unison

Vous voudrez peut-être tester l'outil unison, qui est un outil de synchronisation . Il fournit une méthode visuelle pour identifier les cas spéciaux et décider quoi faire. Il existe une version GUI ( unison-gtk).

sudodus
la source
Bons exemples merci. Je connaissais le / à la fin, je le demande simplement à partir de l'application, et je l'ai manqué (et vous pouvez clairement voir que je viens de le copier / poster
SPooKYiNeSS
Et encore il envoie avant que j'aie fini et ne me laisse pas éditer mon commentaire ... Copié / collé le deuxième. Je vais jeter un coup d'œil à inhabituel et voir s'il peut faire ce que je veux, et sinon je vais revenir au plan b et juste faire un script
SPooKYiNeSS
J'utilise unison-gtkdepuis plusieurs années et j'en suis satisfait. (J'utilise rsyncaussi.)
sudodus
1

Il copie uniquement les nouveaux fichiers dans / dir / a. Tout ce que vous faites dans / dir / b sera ignoré, sauf si vous utilisez l'option --delete. Dans ce cas, les fichiers renommés dans / dir / b seront supprimés. Cela forcera / dir / b à devenir exactement comme / dir / a.

À propos du bonus, voulez-vous dire comme dans le cas de renommer des fichiers dans / dir / a, puis de rsynchroniser vers / dir / b? Je ne pense pas qu'il existe un moyen d'empêcher rsync de simplement copier à nouveau les fichiers dans ce cas.

Hermann Ingjaldsson
la source
Je ne m'attendais pas à ce qu'il y ait un moyen, autre que d'utiliser un attribut pour déterminer, mais alors si je faisais un script pour enfant et j'en aurais plus besoin. Merci pour votre réponse, au moins je sais maintenant ce que je dois faire.
SPooKYiNeSS