Umgang mit umbenannten Dateien oder Verzeichnissen in rsync

26

Ich arbeite an einem rsyncSkript für die Verzeichnisreplikation. Ich synchronisiere nur neue und geänderte Dateien oder Verzeichnisse, aber es gefällt mir nicht, dass beim Kopieren umbenannter Dateien oder Verzeichnisse eine neue Datei oder ein neues Verzeichnis erstellt wird, wodurch die Dateien nicht synchron bleiben. Ich habe außerdem eine Bandbreitenbeschränkung von 1 MB festgelegt, da diese während der Geschäftszeiten ausgeführt wird. Hier ist mein Drehbuch:

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

Wie kann ich Dateien und Verzeichnisse synchron halten, wenn jemand etwas umbenennt und nur neue oder geänderte Dateien kopiert? Hier sind die fraglichen Dateien

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

Oder gäbe es eine Möglichkeit, um auch die umbenannten Dateien in einem anderen Verzeichnis zu verschieben sagen: /mymounts/VerControl?

jmituzas
quelle

Antworten:

23

Sie können mit verschobenen und umbenannten Dateien umgehen, rsyncwenn die Dateisysteme im Quell- und Zielverzeichnis feste Verknüpfungen unterstützen. Die Idee ist, rsync vor der eigentlichen Übertragung harte Links rekonstruieren zu lassen. Sie können finden hier eine brillante Erklärung .

Am Ende haben wir eine einfache Lösung gefunden, die einen versteckten Baum fester Links im Quell- / Zielverzeichnis erstellt. Das grundlegende Skript könnte folgendermaßen aussehen:

# 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"

Ich habe ein Beispielskript auf GitHub . Ich rate Ihnen jedoch, eine große Menge an Tests durchzuführen, bevor Sie diese Methode in der Produktion anwenden.

Dparoli
quelle
Auch die „geniale Erklärung“, auf die Sie verlinken, verweist auf diesen großartigen rsyncBasisartikel, das FWIW. everythinglinux.org/rsync
JakeGould
19

Möglicherweise möchten Sie sich die -y | --fuzzyOption rsync ansehen . Ansonsten kann rsync keine Umbenennungen nachverfolgen, sodass Sie die umbenannten Dateien übertragen.

Aus der rsync-Manpage:

   -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
quelle
7
Beachten Sie, dass Sie bei Verwendung --fuzzyeine Kopplung in Betracht ziehen sollten --delete-delay, da "rsync standardmäßig a ausführt --delete-beforeund somit die Basisdatei entfernt, bevor sie kopiert / verschoben werden kann" . Quelle: Sonia Hamilton
Ronan Jouchet
1

Das kannst du nicht.

Rsync hat drei Modi,

  • Kopieren Sie alle Dateien
  • Kopieren Sie vorhandene (geänderte / nicht geänderte) Dateien - dazu haben Sie viele Möglichkeiten
  • Kopieren Sie nicht vorhandene Dateien.

Diese drei Modi haben jedoch zwei Unterkategorien:

  • Ausschließen am
  • Einschließen am

Rsync verfolgt nicht, welche Dateien umbenannt werden, es hat keinen Status. Kopieren Sie stattdessen alle Dateien und schließen Sie diejenigen aus, die Sie nicht möchten. Sie können keine Shifting-Whitelist haben, Sie können eine Blacklist haben.

rsync [..stuff..] --exclude 'lib/'
Evan Carroll
quelle
gotcha danke für die eingabe muss dann mit den umbenannten dateien leben.
Jmituzas
Sie können die nicht existierenden Dateien löschen lassen, das ist vollkommen in Ordnung. Wenn Sie den Quellcode umbenennen, wird die umbenannte Datei als Funktion des Kopierens kopiert.
Evan Carroll
Ich kann die Versionen mit -b behalten und das Suffix setzen = date +%Y%m%d%k%M%Strotzdem kann ich das Suffix bekommen = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
Jmituzas
0

Soweit ich weiß, rsyncerkennt nicht die neuen Dateien von Umbenennen von Dateien haben wird erneut übertragen. Siehe artyoms Antwort.

Verwenden Sie die --deleteOption , um die gelöschten Dateien zu löschen .

Für das Spiegeln empfehle ich außerdem -a( archive ), das einige nette Optionen enthält.

Schauen Sie sich die man 1 rsyncDetails an.

Lukas
quelle
danke das wird funktionieren --delete / mymounts / test1 / / mymounts / test2 /
jmituzas