rsync aller Ordner des Ziellaufwerks/-ordners?

V

vidtom

unregistriert
Thread Starter
Dabei seit
14.01.2016
Beiträge
78
Reaktionspunkte
76
Hallo,

suche eine Möglichkeit wie ich via rsync alle Ordner die auf einem Ziellaufwerks oder in einem Zielordner sind synchronisiere. Natürlich könnte man das von Hand machen, es sollte aber für beliebige Zielordner mit einer sich verändernden Anzahl an Unterordnern funktionieren.

Ein Anwendungsbeispiel ist z.B. das Backup einer großen Festplatte auf mehrere kleinere Festplatten.
 
Dafür ist doch rsync genau wie geschaffen (was heißt "wie", es ist dafür geschaffen).
Ich verstehe nicht, an welcher Stelle Du ein Problem hast.
 
Vielleicht hilft folgendes zur Beschreibung meines Problems.

Quellvolume:
- Ordner 1
- Ordner 2
- Ordner 3
- Ordner 4
- Ordner 5

Zielvolume:
- Ordner 1
- Ordner 4
- Ordner 5

Würde jetzt gerne mit einem Befehl/skript alle existierenden Ordner auf dem Zielvolume vom Quellvolume synchronisieren - die Ordner auf dem Zielvolume ändern sich dabei und alle Dateien/Unterordner aus den derzeit existierenden Ordnern 1, 4, 5 sollen vollständig synchronisiert werden. Wie das direkt mit rsync geht habe ich nicht gefunden. Werde es wohl mit einem Skript und rekursiv lösen müssen.
 
Code:
xen@ ~/baaa 518
$ ls Zielvolumen/ 
xen@ ~/baaa 519
$ rsync -avrz "Ordner 1" "Ordner 2" "Ordner 3" "Ordner 4" "Ordner 5" Zielvolumen/
sending incremental file list
Ordner 1/
Ordner 2/
Ordner 3/
Ordner 4/
Ordner 5/

sent 127 bytes  received 32 bytes  318.00 bytes/sec
total size is 0  speedup is 0.00
xen@ ~/baaa 520
$ ls Zielvolumen/
Ordner 1  Ordner 2  Ordner 3  Ordner 4  Ordner 5  
xen@ ~/baaa 521
$
 
Vermutlich mache ich einen Fehler beim Erklären. :)

Einmal ist es Ordner 1, 4, 5 auf dem Zielvolume die vorhanden sind und die ich synchronisieren will, und wenn ich irgendwann Ordner 5 nicht mehr will (= lösche) aber dafür Ordner 6 auf dem Zielvolume habe, soll das Skript eben Ordner 1, 4, 6 synchronisieren. Und das für verschiedene Quell- und Zielvolumes. Ziel ist es größere HDDs auf kleineren (älteren) HDDs als Backup zu sichern.

Sprich ich kenne nicht immer welche Ordner auf dem Zielvolume sind, aber nur diese sollen (aber auch alle neu hinzugekommenen Unterordner bzw. neuen Dateien in eben diesen bereits existierenden Ordnern) synchronisiert werden.
 
In der Z-Shell kannst Du das mit einer for Schleife und Parameter Expansion z. B. so lösen:
Code:
for folder in /zielpfad/*(/)                                                                                                                                                                                                                                            
do
rsync -av "/quellpfad/${folder##*/}" /zielpfad/
done

Ist ausbaufähig, aber das Prinzip sollte klar werden.
Anstelle der Parameter Expansion könnte man hier auch basename verwenden; schadet aber nicht, wenn man weiß, was mit Parameter Expansion alles geht. Das ist ein sehr mächtiges Werkzeug.
In anderen modernen Shells gibt es sicher ähnliche Lösungsansätze, aber die Syntax ist möglicherweise etwas anders.
Ein anderer Ansatz wäre z. B. find in Kombination mit -maxdepth und -exec

HTH

Tipps zum "Erklären"
  1. Das möchte ich erreichen
  2. So habe ich es versucht
  3. Das habe ich erwartet
  4. Das ist stattdessen passiert
 
  • Gefällt mir
Reaktionen: vidtom
Code:
for f in *; do if [[ -d $f ]]; then echo "$f"; fi; done
macht im Prinzip was ich brauche denn es listet alle Ordner (der ersten Ebene) eines Volumes oder Ordners auf. Damit kann ich dann mit rsync die bereits auf einem Zielordner vorhandenen Ordner synchronisieren. Dachte es gäbe eine direkte rsync-Lösung aber so passt es letztendlich auch.
 
Code:
for f in *; do if [[ -d $f ]] ... fi
Das ist umständlich.
Die Z-Shell kann
Code:
for f in *(/); do ...
 
bash :crack:
Code:
for d in */; do ...
 
Mal nachgefragt, aber wie sieht dann das fertige Script von Dir aus?
 
vidtom is mittlerweile unregistriert. da stehen die chancen wohl nicht so gut, eine antwort zu bekommen.
 
  • Gefällt mir
Reaktionen: Meilenstein
Zurück
Oben Unten