Synchronisieren von Ordnerstrukturen mit Modifizierungen

Status
Für weitere Antworten geschlossen.

silofonari

Benutzer
Mitglied seit
14. Nov 2014
Beiträge
81
Punkte für Reaktionen
0
Punkte
6
Hallo liebe Foren-Gemeinde.


Mir schwebt in den vergangenen Tagen ein etwas merkwürdiges Projekt vor Augen - das lässt sich vermutlich schon an dem wenig-sagenden Titel dieses Threads erkennen :eek: .

Am einfachsten lässt es sich anhand der konkreten Aufgabe beschreiben:

Ich bin fotografisch tätig und verwende meine DS auch als Datenspeicher für meine Fotos. Diese werden dabei (innerhalb des Foto-Ordners) mit folgender Ordnerstruktur abgelegt:

Rich (BBCode):
Foto-Ordner/Jahr/Projekt/

Innerhalb des Ordners "Projekt" gibt dann nochmal (je nach Bedarf) die folgenden Unterordner:
  • Capture
  • Master
  • Output

In den Ordner "Output" kommen - wie der Name schon sagt - alle fertig bearbeiteten (JPG-)Fotos. Mein Ziel ist es, den Inhalt des Output-Ordners mit dem Ordner /volume1/photo/, also dem Photo-Station-Ordner, zu synchronisieren, aber rekursiv, d.h. nicht die Fotos aller Projekte einfach in einen Ordner, sondern schön nach Projekt getrennt.

Das allein wäre ja noch ziemlich einfach zu bewerkstelligen: ich würde einfach ein rsync-script als Aufgabe im DSM einrichten, das jeden Tag automatisch ausführen lassen, und die Sache wäre erledigt - dachte ich! Aber nix da:

Rich (BBCode):
rsync --dry-run --include='Output/**' --include='*/' --exclude='*' -avuzl /volume1/Foto-Ordner/2015/ /volume1/photo/

(Ich würde das Skript einfach zum Jahreswechsel erneuern, damit ich mich nicht auch noch um den Unterordner mit dem Jahr kümmern muss)

Das kommt dem am nächsten, stimmt aber auch nicht ganz, da hierdurch trotzdem noch die jeweiligen "Capture" und "Master" Verzeichnisse am Zielort angelegt werden, wenn auch ihr Inhalt nicht kopiert wird. Klar könnte ich "Capture" und "Master" auch noch explizit mit --exclude ausschließen, aber hin und wieder kommt es vor, dass es noch einen weiteren Ordner neben Capture, Master und Output gibt (z.B. "Videos", "Behind the Scenes" o.ä.) - diese sollen automatisch auch ausgeschlossen sein, ohne dass ich mir jedes Mal Sorgen machen muss, ob mein Skript noch stimmt, wenn ich einen neuen Ordner anlege.

Kann mir hier schon mal jemand weiterhelfen? Diese include-exclude-Struktur von rsync ist echt ganz schön schwierig zu verstehen für den Anfang, finde ich... :rolleyes:


Es kommt aber noch verschärfter. In meiner Vorstellung sollen die Dateien des Output-Ordners nicht in im Ordner "Output" landen, sondern im Projekt-Ordner selber. D.h. die Dateien aus dem Ordner Foto-Ordner/Jahr/Projekt/Output/ sollen in den Ornder /volume1/photo/Projekt/. Hierzu nochmal ein Beispiel, wie Quellordner und Zielordner aussehen sollen:

Quellordner:
Rich (BBCode):
/volume1/Foto-Ordner/Jahr/Projekt/Output/
   DateiA.jpg
   DateiB.jpg
   DateiC.jpg

Zielordner:
Rich (BBCode):
/volume1/photo/Projekt/
   DateiA.jpg
   DateiB.jpg
   DateiC.jpg


Mit rsync alleine wird das vermutlich nicht zu bewerkstelligen sein.

Ich wäre euch auf jeden Fall wahnsinnig verbunden, wenn ihr mir an dieser Stelle irgendwie weiterhelfen könntet. Dieses Skript wäre für mich sehr wichtig, da aufgrund der schieren Menge an Projekten und dadurch, dass ein Projekt nicht immer auf einmal abgeschlossen wird, sondern teilweise auch noch Wochen später neue JPGs zum Output-Ordner hinzugefügt werden, ein manuelles Verschieben der Dateien sehr unpraktisch bzw. quasi unmöglich ist. Ein Skript hierfür würde mir die Arbeit unglaublich erleichtern und auf Dauer sehr viel Zeit und Nerven sparen!


Vielen vielen Dank schon für alle, die etwas dazu beitragen :D:D
 

silofonari

Benutzer
Mitglied seit
14. Nov 2014
Beiträge
81
Punkte für Reaktionen
0
Punkte
6
Niemand einen Tipp?

Ich wäre wirklich unglaublich dankbar für Hinweise
 

tuxfive

Benutzer
Mitglied seit
08. Mrz 2015
Beiträge
4
Punkte für Reaktionen
0
Punkte
0
Dann bastel dir mal eine kleine Testumgebung zusammen, ich habe ein kleines Shell-Skript zum Ausprobieren:
Code:
#!/bin/sh

QUELLE=Foto-Ordner/$(date +%Y)     # /volume1/Foto-Ordner/2015
ZIEL=photo	# /volume1/photo

for VZ in $QUELLE/*; do
 if [ -d $VZ ]; then
	PROJEKTVZ="${VZ##*/}"
	rsync --dry-run -avuzl "$QUELLE/$PROJEKTVZ/Output/" "$ZIEL/$PROJEKTVZ"
 fi
done
Es wird bisher nur der Foto-Ordner vom aktuellen Jahr synchronisiert.. oder soll das Skript evtl. alle Jahre synchronisieren?
 

silofonari

Benutzer
Mitglied seit
14. Nov 2014
Beiträge
81
Punkte für Reaktionen
0
Punkte
6
Dann bastel dir mal eine kleine Testumgebung zusammen, ich habe ein kleines Shell-Skript zum Ausprobieren:
Code:
#!/bin/sh

QUELLE=Foto-Ordner/$(date +%Y)     # /volume1/Foto-Ordner/2015
ZIEL=photo	# /volume1/photo

for VZ in $QUELLE/*; do
 if [ -d $VZ ]; then
	PROJEKTVZ="${VZ##*/}"
	rsync --dry-run -avuzl "$QUELLE/$PROJEKTVZ/Output/" "$ZIEL/$PROJEKTVZ"
 fi
done
Es wird bisher nur der Foto-Ordner vom aktuellen Jahr synchronisiert.. oder soll das Skript evtl. alle Jahre synchronisieren?

Wow, das sieht schon mal vielversprechend aus. Das eine, aktuelle Jahr reicht, wie oben geschrieben. Das einmal pro Jahr zu ändern ist ja kein Problem.

Ich werde es heute Abend testen, sobald ich zuhause bin. Vielen Dank!

Wenn du magst würde ich mich auch noch über eine kleine Nachhilfe freuen, was das "VZ" macht? Also der Syntax ist mir in seinen Grundzügen schon bekannt, aber ich komme nicht so ganz hinter das VZ dahinter...


ERGÄNZUNG
Habe noch ein Problem festgestellt: Es kann auch vorkommen, dass ein Quell-Verzeichnis keinen Output-Ordner enthält (das ist z.B. der Fall, wenn das Foto-Projekt nur ein paar Testaufnahmen waren, die niemals irgendwo gedruckt oder gepostet werden sollen). Wenn kein Output-Ordner in der Quelle existiert, dann spuckt das Skript allerdings folgenden Fehler aus

Rich (BBCode):
rsync: change_dir "/volume1/photos/2015/2015-MM-TT_DER-PROJEKTNAME/Output" failed: No such file or directory (2)

sent 12 bytes  received 12 bytes  48.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1240) [sender=3.0.9]
 
Zuletzt bearbeitet:

dil88

Benutzer
Sehr erfahren
Mitglied seit
03. Sep 2012
Beiträge
30.846
Punkte für Reaktionen
2.284
Punkte
829
Du musst das Jahr nicht am 1.1. ändern, auch das erledigt das Skript automatisch, da es das Jahr aus dem aktuellen Datum extrahiert:

Rich (BBCode):
QUELLE=Foto-Ordner/$(date +%Y)     # /volume1/Foto-Ordner/2015

Das, was hinter dem # steht, ist nur ein Beispiel. Ein # leitet einen Kommentar ein und wird nicht ausgeführt.

VZ wird in der Schleife mit allem belegt, was in Deinem Quell-Verzeichnis - also beispielsweise /volume1/Foto-Ordner/2015/ - enthalten ist. Nur wenn es ein Verzeichnis ist ("[ -d <dirname>" entspricht "test -d <dirname>", was prüft, ob es sich bei dem Inhalt der Variablen VZ um ein directory handelt), wird der Schleifeninhalt abgearbeitet, andernfalls der nächste Inhalt des Quell-Verzeichnisses dahingehend überprüft, ob es sich diesmal um ein Verzeichnis handelt.

Zu dem Problem, was Dir aufgefallen ist, probiere es bitte nochmal mit dieser erweiterten Version:

Rich (BBCode):
#!/bin/sh

QUELLE=Foto-Ordner/$(date +%Y)     # /volume1/Foto-Ordner/2015
ZIEL=photo	# /volume1/photo

for VZ in $QUELLE/*; do
if [ -d $VZ ]; then
  PROJEKTVZ="${VZ##*/}"
  if [ -d $QUELLE/$PROJEKTVZ/Output ]; then
    rsync --dry-run -avuzl "$QUELLE/$PROJEKTVZ/Output/" "$ZIEL/$PROJEKTVZ"
  fi
fi
done
 
Zuletzt bearbeitet:

silofonari

Benutzer
Mitglied seit
14. Nov 2014
Beiträge
81
Punkte für Reaktionen
0
Punkte
6
Du musst das Jahr nicht am 1.1. ändern, auch das erledigt das Skript automatisch, da es das Jahr aus dem aktuellen Datum extrahiert:

Rich (BBCode):
QUELLE=Foto-Ordner/$(date +%Y)     # /volume1/Foto-Ordner/2015

Ja das werde ich wohl aber doch wieder lieber manuell machen. Denn schließlich habe ich nicht unbedingt alle Projekte aus 2014 am 1.1.2015 abgeschlossen. Deshalb soll lieber ein paar Tage lang noch (bis ich es ändere) der 2014-Ordner synchronisiert sein. Aber fein, dass es zumindest auch hier eine Möglichkeit zur Automatisierung gäbe.

Das, was hinter dem # steht, ist nur ein Beispiel. Ein # leitet einen Kommentar ein und wird nicht ausgeführt.

VZ wird in der Schleife mit allem belegt, was in Deinem Quell-Verzeichnis - also beispielsweise /volume1/Foto-Ordner/2015 - enthalten ist. Nur wenn es ein Verzeichnis ist ("[ -d" entspricht "test -d", was prüft, ob es sich bei dem Inhalt der Variablen VZ um ein directory handelt), wird der Schleifeninhalt abgearbeitet, andernfalls der nächste Inhalt des Quell-Verzeichnisses dahingehend überprüft, ob es sich um ein Verzeichnis handelt.

Ja, mit dem allg. Syntax einer Schleife und auch Kommentaren bin ich wie gesagt theoretisch ganz grob vertraut. Aber z.B. die Verzeichnis-Option macht es jetzt um einiges einleuchtender, danke!


Nur das Problem aus der Ergänzung meines vorherigen Posts besteht leider fort.


UPDATE
Mit der Ergänzung in deinem Beitrag oben klappt alles wie am Schnürchen. Das ist echt der Wahnsinn, wie einem eine tolle Community auf die Schnelle weiterhelfen kann.

Ich hoffe ihr habt nochmal einen guten Tipp für mich: Es sind zwar unter /volume1/photo/ alle Ordner exakt so angelegt worden, wie von mir vorhergesehen, was wunderbar ist. Leider werden neue Ordner nur nicht als Alben erkannt von der Photo Station. Vermutlich würde ein Neu-Indexieren der Dateien das Problem beheben, aber es soll ja alles automatisch funktionieren... also wie mache ich das? Ich schätze, es hängt mit dem Stichwort "synoindex" zusammen? Leider finden sich da auf der ersten Google-Seite viele Problem-Fälle ohne Lösung dazu...


UPDATE 2
Okay zumindest letzteres Problem konnte ich selbstständig lösen. Einfach das System noch mit dem Befehl synoindex -R photo füttern - hier galt wie so oft: "RTFM" :cool:

Jetzt packe ich das ganze in crontab und lasse mich in den nächsten Tagen davon überzeugen, dass tatsächlich alles glatt läuft!


Auf jeden Fall jetzt schon mal ein ganz fettes Danke an euch, ihr habt mir sehr geholfen!
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat