So synchronisieren Sie mehrere Quellordner

34

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

z.B

/etc/fstab
/home/user/download

Ich habe über 3 Lösungen nachgedacht:

  • Lösung 1

Mehrfachaufruf zu rsync

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

con: schwerer zu aggregieren stat

  • Lösung 2

Erstellen Sie einen tobackupOrdner mit Symlink und verwenden Sie die -LOptionen

sync -aL /home/user/tobackup bkp

con: content to backup darf keine symlinks enthalten

  • Lösung 3

Verschieben Sie Dateien in das Backup und erstellen Sie einen Symlink am ursprünglichen Speicherort

rsync -a /home/user/tobackup bkp

con: einige manuelle Konfig

Welches empfehlen Sie?

Gibt es einen besseren Weg?

user1437346
quelle
Remote-Quelle: stackoverflow.com/questions/15817583/…
Ciro Santilli

Antworten:

33

Sie können mehrere Quellargumente übergeben.

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

Dies erzeugt bkp/fstabund 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 Einschluss- / Ausschlussregeln, um anzugeben, welche Dateien kopiert werden sollen. Hierfür gibt es zwei Möglichkeiten:

  • Schließen Sie explizit jede Datei sowie jede Verzeichniskomponente ein, die zu ihr führt, und zwar /***am Ende der Verzeichnisse, 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 oberste Ebene mit /*/(so dass rsync durchqueren /etcund /homewenn für Dateien zu kopieren suchen) und Second-Level - Verzeichnisse mit /*/*/(für /home/user), aber abstreifen Verzeichnisse , in denen keine Datei kopiert wird. Dies ist bequemer, da Sie die Eltern nicht explizit auflisten müssen. Sie könnten sogar verwenden, --prune-empty-dirs --include='*/'anstatt die Anzahl der Ebenen zu zählen, aber dies ist hier unpraktisch, da rsync das gesamte Dateisystem durchlaufen würde, um Verzeichnisse zu durchsuchen, obwohl keine der Include-Regeln mit irgendetwas außerhalb von /etcund übereinstimmen kann /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    
Gilles 'SO - hör auf böse zu sein'
quelle
1
Großartig, aber wie kann man die Verzeichnisstruktur innerhalb von bkp halten?
Rodrigo
Ich meine, bkp / etc / fstab und bkp / home / user / dowlonad? Oder vielleicht / bkp / fstab und bkp / download?
Rodrigo
@ Rodrigo Ich habe meine Antwort bearbeitet
Gilles 'SO - hör auf, böse zu sein'
13

Die Antwort von Gilles gefällt mir sehr gut. Ich möchte jedoch hinzufügen, dass aus meiner Sicht die Anforderung, mehrere Ordner unter Beibehaltung der Verzeichnisstruktur zu synchronisieren, am besten durch Übergabe mehrerer Quellargumente in Verbindung mit der --relativeOption erfüllt wird .

In diesem Fall könnten wir Folgendes haben:

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

die in Folge hätte bkp/etc/fstabund bkp/home/user/download.

Das Beste daran ist, dass wir (glaube ich 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 --relativeOption hier )

Also zB wenn wir das gemacht haben

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

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

Christoph
quelle
2

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

Ähnlich wie beim Aufrufen von geschweiften Klammern sytnax mit cp und bestimmten anderen Dienstprogrammen:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive
Brad Hein
quelle
Wie würden Sie den SSH-Port damit angeben? Diese Syntax scheint zu funktionieren, wenn-e
tcurdt