So synchronisieren Sie mehrere Quellordner per Rsync

So synchronisieren Sie mehrere Quellordner per Rsync

Ich möchte mehrere Quellen per Rsync synchronisieren und frage mich, wie das am besten geht.

z.B

/etc/fstab
/home/user/download

Ich habe über 3 Lösungen nachgedacht:

  • Lösung 1

Mehrfachaufruf von rsync

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

Nachteil: Es ist schwieriger, aggregierte Statistiken zu erhalten

  • Lösung 2

Erstellen Sie einen tobackupOrdner, der einen symbolischen Link enthält, und verwenden Sie -LOptionen

sync -aL /home/user/tobackup bkp

Nachteil: Der zu sichernde Inhalt darf keine symbolischen Links enthalten.

  • Lösung 3

Verschiebe Dateien ins Backup und erstelle einen symbolischen Link am ursprünglichen Speicherort

rsync -a /home/user/tobackup bkp

Nachteil: einige manuelle Konfigurationen

Welches würden Sie empfehlen?

Gibt es einen besseren Weg?

Antwort1

Sie können mehrere Quellargumente übergeben.

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

Dadurch werden bkp/fstabund erstellt bkp/download, wie bei den separaten Befehlen, die Sie angegeben haben. Es kann wünschenswert sein, stattdessen die Quellstruktur beizubehalten. Verwenden Sie dazu /als Quelle und verwenden SieEinschluss-/Ausschlussregelnum anzugeben, welche Dateien kopiert werden sollen. Hierzu gibt es zwei Möglichkeiten:

  • Schließen Sie jede Datei sowie jeden Verzeichnisbestandteil, der dorthin führt, explizit ein, insbesondere /***am Ende von Verzeichnissen, 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
    
  • Schließen Sie alle Verzeichnisse der obersten Ebene mit ein (damit rsync und /*/durchläuft , wenn nach zu kopierenden Dateien gesucht wird) und Verzeichnisse der zweiten Ebene mit (für ), entfernen Sie jedoch Verzeichnisse, in die keine Dateien kopiert werden. Dies ist praktischer, da Sie übergeordnete Verzeichnisse nicht explizit auflisten müssen. Sie könnten sogar verwenden, anstatt die Anzahl der Ebenen zu zählen, aber dies ist hier unpraktisch, da rsync das gesamte Dateisystem durchlaufen würde, um Verzeichnisse zu erkunden, obwohl keine der Einschlussregeln auf etwas außerhalb von und zutreffen kann ./etc/home/*/*//home/user--prune-empty-dirs --include='*/'/etc/home/user/download

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

Antwort2

Mir gefällt die Antwort von Gilles sehr gut, ich möchte jedoch hinzufügen, dass meiner Ansicht nach die Anforderung, mehrere Ordner zu synchronisieren und gleichzeitig die Verzeichnisstruktur beizubehalten, am besten erfüllt wird, indem in Verbindung mit der --relativeOption mehrere Quellargumente übergeben werden.

In diesem Fall könnte das Ergebnis etwa wie folgt lauten:

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

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

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 am Ziel replizieren möchten.
(Siehe die Dokumentation zur --relativeOptionHier)

Wenn wir das also machen würden

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

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

Antwort3

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

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Etwas Ähnliches passiert, wenn Sie die Syntax mit geschweiften Klammern mit cp und bestimmten anderen Dienstprogrammen aufrufen:

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

verwandte Informationen