Verwenden von rsync zum Verwalten einer Kopie eines Verzeichnisses mit einem sich ändernden Namen

Verwenden von rsync zum Verwalten einer Kopie eines Verzeichnisses mit einem sich ändernden Namen

Ich verwende rsync auf einem Linux-System, um ein Verzeichnis zwischen der lokalen Festplatte und einem angeschlossenen USB-Laufwerk zu synchronisieren. Das Problem, das ich habe, ist, dass das Drittanbietersystem, das täglich das Backup auf dem Server erstellt, tatsächlich den Namen eines Verzeichnisses ändert, das tief im Backup verschachtelt ist. Dieses Verzeichnis enthält den Großteil der für das Backup erforderlichen Daten. Wenn rsync das Verzeichnis überprüft, erkennt es, dass sich der Name geändert hat, und betrachtet es als ein völlig neues Verzeichnis. Meine rsync-Kopie auf dem USB-Laufwerk hat also für jeden Tag, an dem sie ausgeführt wird, ein neues Verzeichnis.

Ich habe Skripte geschrieben, die den Verzeichnisnamen tatsächlich wieder ändern, aber das ist eine umständliche Vorgehensweise!

Ich suche nach einer „eleganten“ Möglichkeit, damit umzugehen. Ist es möglich, einen Link zum Verzeichnis zu erstellen, der konstant bleibt? Kann rsync so konfiguriert werden, dass es erkennt, dass das Verzeichnis dasselbe ist, obwohl der Name geändert wurde? Ich bin sicher, dass jemand schon einmal damit zu tun hatte!

Antwort1

Ein Ansatz wäre, es in zwei Schritten zu tun. 1. rsyncen Sie alles außer dem betreffenden Verzeichnis, indem Sie Ignoriermuster verwenden. 2. rsyncen Sie nur das Verzeichnis, indem Sie in Bash Globbing verwenden, um zum Verzeichnis zu gelangen, etwa so:

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

Die Verwendung eines abschließenden Schrägstrichs im Quellverzeichnis führt dazu, dass rsync den Verzeichnisnamen ignoriert, da es auf demInhaltdes Verzeichnisses und nicht des Verzeichnisses selbst. Natürlich ist dieses Globbing am einfachsten, wenn das Verzeichnis mit einem konstanten Präfix oder Suffix benannt ist, wie in meinem Beispiel oben. Wenn das nicht der Fall ist, können Sie ein Skript schreiben, um den tatsächlichen Namen des Verzeichnisses herauszufinden, und etwas Direkteres tun, wie dies:

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

Am Ende würde Ihr Pseudocode ungefähr so ​​aussehen:

  1. $BIGDATADIRNAME suchen
  2. Rsync alles wie vorher, aber ignorieren Sie $BIGDATADIRNAME
  3. Rsync dieInhaltvon $BIGDATADIRNAME

Antwort2

Möglicherweise können Sie die rsync-Optionen verwenden--compare-dest=DIR,--copy-dest=DIR, oder--link-dest=DIR. Sie ermöglichen Ihnen, auf der Empfangsseite ein zusätzliches Verzeichnis anzugeben, in dem nach fehlenden Dateien gesucht werden soll.

Mit --link-dest erstellt rsync beispielsweise die neue Version des Verzeichnisses, die neue Kopien der geänderten Dateien enthält, bzw. fest verknüpfte Kopien der unveränderten Dateien.

Um eine dieser Optionen zu verwenden, müssen Sie den Namen des Verzeichnisses auf dem USB-Laufwerk vom vorherigen rsync-Lauf kennen. Daher möchten Sie rsync wahrscheinlich in ein Skript einbinden, das zuerst den richtigen Verzeichnisnamen ermittelt.

Sie können auch --delete-after verwenden, um die alten Versionen des Verzeichnisses nach dem Erstellen der neuen Version zu löschen.

Antwort3

Rsync allein kann nicht das tun, was Sie wollen, da die einzigen Metadaten, die rsync zur Verfügung hat, der Verzeichnisname und die MAC-Zeiten sind.

Die einzige Möglichkeit, dies innerhalb von rsync automatisch zu handhaben, wäre, wenn rsync irgendwie mehr Metadaten hätte. Die DFS-Replikation von Microsoft unter Windows handhabt dies beispielsweise, indem sie die eindeutige ID verwendet, die Dateien in einem NTFS-Volume zugewiesen wird, um zu erkennen, wenn sich ein Datei- (oder Verzeichnis-)Name ändert.

Ihr unelegantes Skript ist wahrscheinlich die einfachste Möglichkeit, das gewünschte Ergebnis zu erzielen, ohne rsync zu beenden und nach einem anderen Tool zu suchen.

Die Verwendung eines symbolischen Links funktioniert nicht, da der Verbindungspunkt an den Namen des Zielverzeichnisses gebunden ist (und sich in diesem Fall der Name des Zielverzeichnisses ändern würde). Sie könnten einen Hardlink verwenden (der an den Inode gebunden ist), aber Sie müssen sicherstellen, dass sich der Verzeichnisname ändert und nicht einfach gelöscht und neu erstellt wird (was ihm einen anderen Inode zuweisen würde).

verwandte Informationen