Gestion des fichiers ou répertoires renommés dans rsync

26

Je travaille sur un rsyncscript pour la réplication d'annuaire. Je ne synchronise que des fichiers ou des répertoires nouveaux et modifiés, mais je n'aime pas le fait que sa copie ait renommé des fichiers ou des répertoires en tant que nouveau fichier ou répertoire, gardant les fichiers non synchronisés. J'ai également défini une limite de bande passante de 1 Mo, car cela fonctionnera pendant les heures de travail. Voici mon script:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

Comment synchroniser les fichiers et les répertoires si quelqu'un renomme quelque chose, tout en ne copiant que les fichiers nouveaux ou modifiés? Voici les fichiers en question

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

Ou y aurait-il un moyen de déplacer même les fichiers renommés vers un autre répertoire, dites /mymounts/VerControl:?

jmituzas
la source

Réponses:

23

Vous pouvez gérer les fichiers déplacés et renommés avec rsyncsi les systèmes de fichiers des répertoires source et cible prennent en charge les liens matériels. L'idée est de laisser rsync reconstruire les liens durs avant le transfert réel. Vous pouvez trouver une explication brillante ici .

Nous nous sommes retrouvés avec une solution simple qui crée une arborescence cachée de liens durs à l'intérieur du répertoire source / cible, le script de base pourrait être comme ceci:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

J'ai un exemple de script sur GitHub . Mais je vous conseille de faire un grand nombre de tests avant d'utiliser cette méthode en production.

dparoli
la source
La "brillante explication" à laquelle vous vous rsyncréférez fait également référence à cet excellent article de base , FWIW. everythinglinux.org/rsync
JakeGould
19

Vous voudrez peut-être regarder l' -y | --fuzzyoption rsync. En dehors de cela, rsync n'a aucun moyen de suivre les renommages, vous finirez par transférer le fichier renommé.

Depuis la page de manuel rsync:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.
artyom
la source
7
Notez que, si vous utilisez --fuzzy, vous devriez envisager de le coupler avec --delete-delay, car "rsync par défaut fait un --delete-before, supprimant ainsi le fichier de base avant de pouvoir le copier / déplacer" . Source: Sonia Hamilton
Ronan Jouchet
1

Tu ne peux pas.

Rsync a trois modes,

  • Copiez tous les fichiers
  • Copiez les fichiers existants (modifiés / non modifiés) - vous disposez de nombreuses options
  • Copiez les fichiers inexistants.

Cependant, ces trois modes ont deux sous-catégories,

  • Exclure le
  • Inclure sur

Rsync ne suit pas quels fichiers sont renommés, il n'a aucun état. Pensez plutôt à copier tous les fichiers et à exclure ceux dont vous ne voulez pas . Vous ne pouvez pas avoir de liste blanche mobile, vous pouvez avoir une liste noire.

rsync [..stuff..] --exclude 'lib/'
Evan Carroll
la source
gotcha merci pour l'entrée devra alors vivre avec les fichiers renommés.
jmituzas
Vous pouvez lui faire supprimer les fichiers qui n'existent pas, c'est très bien. Mais en fonction de la copie, si vous renommez sur la source, il copiera le fichier renommé.
Evan Carroll
Je peux conserver les versions avec -b et définir le suffixe = de date +%Y%m%d%k%M%Stoute façon je peux obtenir le suffixe = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas
0

Pour autant que je sache, rsyncne peut pas reconnaître le changement de nom des fichiers. Les nouveaux fichiers devront être transférés à nouveau. Voir la réponse d' artyom .

Pour supprimer les fichiers disparus, assurez-vous d'utiliser l' --deleteoption.

De plus, pour la mise en miroir, je vous recommande d'utiliser -a( archive ), qui alias de belles options.

Jetez un œil aux man 1 rsyncdétails.

Lukas
la source
merci qui fonctionnera - supprimer / mymounts / test1 / / mymounts / test2 /
jmituzas