it-swarm.com.de

So synchronisieren Sie mehrere Quellordner

Ich möchte mehrere Quellen synchronisieren und frage mich, wie ich das am besten erreichen kann.

z.B.

/etc/fstab
/home/user/download

Ich dachte über 3 Lösungen nach:

  • Lösung 1

mehrfachaufruf an rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

con: schwerer zu aggregieren stat

  • Lösung 2

erstellen Sie einen Ordner tobackup, der Symlink enthält, und verwenden Sie -L Optionen

sync -aL /home/user/tobackup bkp

con: Der zu sichernde Inhalt darf keine Symlinks enthalten

  • Lösung 3

verschieben Sie Dateien in ein Backup und erstellen Sie einen Symlink am ursprünglichen Speicherort

rsync -a /home/user/tobackup bkp

con: einige manuelle Konfiguration

Welches empfehlen Sie?

Gibt es einen besseren Weg?

39
user1437346

Sie können mehrere Quellargumente übergeben.

rsync -a /etc/fstab /home/user/download bkp

Dies erzeugt bkp/fstab Und bkp/download, Wie die separaten Befehle, die Sie gegeben haben. Es kann wünschenswert sein, stattdessen die Quellstruktur beizubehalten. Verwenden Sie dazu / Als Quelle und verwenden Sie Include-Exclude-Regeln , um anzugeben, welche Dateien kopiert werden sollen. Es gibt zwei Möglichkeiten, dies zu tun:

  • Fügen Sie jede Datei sowie jede dazu führende Verzeichniskomponente explizit ein, wobei /*** Am Ende der Verzeichnisse steht, wenn Sie den gesamten Verzeichnisbaum kopieren möchten:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Fügen Sie alle Verzeichnisse der obersten Ebene mit /*/ (Damit rsync /etc Und /home Durchläuft, wenn Sie nach zu kopierenden Dateien suchen) und Verzeichnisse der zweiten Ebene mit /*/*/ (für /home/user), aber entfernen Sie Verzeichnisse, in die keine Datei kopiert wird. Dies ist bequemer, da Sie die Eltern nicht explizit auflisten müssen. Sie könnten sogar --Prune-empty-dirs --include='*/' Verwenden, anstatt die Anzahl der Ebenen zu zählen. Dies ist hier jedoch unpraktisch, da rsync das gesamte Dateisystem durchlaufen würde, um Verzeichnisse zu durchsuchen, obwohl keine der Include-Regeln mit etwas außerhalb von /etc Übereinstimmen kann. und /home/user/download.

    rsync -a --Prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

Die Antwort von Gilles gefällt mir sehr gut. Ich möchte jedoch hinzufügen, dass meiner Ansicht nach die Anforderung, mehrere Ordner unter Beibehaltung der Verzeichnisstruktur zu synchronisieren, am besten erfüllt wird, indem mehrere Quellargumente in Verbindung mit der Option --relative Übergeben werden.

In diesem Fall könnten wir Folgendes haben:

rsync -aR /etc/fstab /home/user/download bkp

was zu bkp/etc/fstab und bkp/home/user/download führen würde.

Das Beste daran ist, dass wir (ich glaube seit rsync v. 2.6.7) im Wesentlichen steuern können, wie viel von der Verzeichnisstruktur wir auf dem Empfänger replizieren möchten.
(Siehe Dokumentation zur Option --relativehier )

So z.B. wenn wir das tun würden

rsync -aR /home/./user1/download /home/./user2/download bkp

wir würden mit bkp/user1/download und bkp/user2/download enden.

17
Christoph

Dies funktioniert auch - geschweifte Klammern, die eine durch Kommas getrennte Liste von Quellen enthalten.

rsync -vap --progress --stats [email protected]:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Etwas ähnlich wie beim Aufrufen von sytnax für geschweifte Klammern mit cp und bestimmten anderen Dienstprogrammen:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
3
Brad Hein