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 tobackup
Ordner, der einen symbolischen Link enthält, und verwenden Sie -L
Optionen
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/fstab
und 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 --relative
Option 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/fstab
was 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 --relative
OptionHier)
Wenn wir das also machen würden
rsync -aR /home/./user1/download /home/./user2/download bkp
bkp/user1/download
wir 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