Neue Filme automatisch ab Datum auf Ext. USB schieben „Synology“

  • Moin Moin zusammen,

    habt ihr vielleicht eine Idee/Lösung für mich wie ich meine neuen Filme ab einem bestimmten Datum auf eine Ext. USB Platte schieben kann.

    Das ganze sollte automatisch ablaufen, die USB Festplatte hängt an meiner Synology NAS und ist in DSM eingebunden.

    Da ich im Paketzentrum alle Backup und Cloud Sync Themen bereits durch habe, habe ich davon aus das ich das per Skript über die Aufgabensteuerung starten müsste. Doch genau da ist mein Problem. Ich bin in Linux überhaupt nicht zuhause und bräuchte dabei jemanden der mir vielleicht eine kleine Zeile schreibt.

    Rahmenbedingungen sind diese:

    Es sollen alle neuen (ab ein Datum „welches ich im Skript anpasse“) Ordner immer auf die ex. Festplatte kopiert werden.

    Zeitangabe steuere ich ja über den Aufgabenplanner.

    Beispiel:

    \\volumen1\diskstation\Filme\*alle neuen Filme/Ordner ab den 23.02.“ Erstellungsdatum

    \\volumen1\diskstation\Kinderfilme\*alle neuen Filme/Ordner ab den 23.02.“ Erstellungsdatum

    = das „ab-Datum“ ist immer das selbe bei allen Ordnern.

    Auf einen USB-Share kopieren:

    \\USB-Share\Filme\

    \\USB-Share\Kinderfilme\

    * die Hauptordner *\Filme *\Kinderfilme sind bereits auf der USB Platte angelegt.


    Vielleicht noch eine Regel das wenn es bereits einen Ordner bestimmten Ordner gibt, der alte immer überschrieben wird.


    „Optional“
    Optimaler Weise wird der Kopiervorgang mir auch in der Benachrichtigung angezeigt.

    Wenn es kein Skript ist und ihr vielleicht einen entscheidenen Tip habt wie ich das vielleicht sogar mit einer UI in der DSM „Synology“ lösen kann wäre das natürlich noch besser, aber wie gesagt habe ich da nichts gefunden.

    Würde mich riesig freuen wenn sich aus der Linuxwelt sich dem Thema kurz annehmen würde.

    In dem Sinne der neue Smiley *P

    Danke und viele Grüße
    Seger

  • Müsste doch theoretisch mit einer der Backuplösungen für die DS funktionieren

    Gesendet von meinem Toaster mit Tapatalk

    will jetzt nicht nochmal nein sagen wie bereits oben geschrieben, aber ich habe keine Funktion gefunden. In keinem Paket auch in keinem welches nicht von Synology kommt „alternative Quellen“. Wenn du da was findest gern her damit, sonst bleibt der Hilfeschrei nach einem Skript.

    Danke und viele Grüße

    Seger

  • Also ob man das über die Synology machen kann (scripte einfügen), weiß ich nicht.

    Was aber (erstmal nur theoretisch) gehen würde wäre folgendes:

    - auf dem NAS bestehen gewisse Shares, die Ordner enthalten
    - am NAS hängt eine USB Platte, die ebenso als Share im Netzwerk besteht

    Das erstmal zu den Grundvorraussetzungen

    Dann könnte man es so regeln:

    - es gibt einen PC auf dem Linux läuft (da müsste ich noch genau wissen, welches OS und welche Shell verwendet werden soll)
    - man muss alle Shares direkt auf dem PC mounten
    - via find /path/zum/mountpoint/der/quelle/ -type d <hier noch ein wenig Magic bzgl. des Datums> -exec cp {} /pfad/zum/Ziel/share \; Das würde nach Ordnern eines Gewissen Datums suchen und die gefundenen dann an das Ziel kopieren
    - dann könnte man das ganze noch mit einem Cronjob regeln, der das Script immer wieder an einem bestimmten Tag oder einer einer bestimmten Uhrzeit (oder in Kombination) aufruft.

    Wäre sowas in deinem Interesse? Dann würde es nicht mehr ausschließlich über die Synology laufen sondern halt über einen weiteren PC. Man muss auch keinen Cronjob verwenden. Man kann das ganze auch immer manuell anstoßen wann auch immer man es braucht.

  • Ja, genau sowas meine ich wohl wenn es keine UI Lösung über Synology gibt.

    Aber mit wäre es wichtig das es auf der Synology abläuft. Zum Hintergrund, es läuft das Betriebssystem DSM auf der Synology das auf Linuxbasis läuft. Die Usb Festplatte ist angeschlossen und im DSM integriert und man kann intern per \\Usb-Share\ drauf zugreifen. In DSM kann man Shellskripte (Datei.sh) aufrufen ausführen lassen. Das ausführen kann man sehr einfach per Aufgabenplaner ausführen. Ich kann aber diese „Sprache“ auf Basis von Linux Shell nicht.

    Reicht das zum Hintergrund und hast du da eine Idee?

    Edit: das Skript muss doch auf vorhandene Filmordner per Überspringen reagieren, sonst würde er ja immer wieder alles kopieren.

    Außer man bekommt da noch die Bedingung rein, dass wenn das neue Erstellungsdatum des Films neuer ist das er dann überschreibt.-> das wäre die perfekte Lösung!

    Danke
    Seger

    Einmal editiert, zuletzt von Seger (24. Februar 2018 um 10:34)

  • Allgemeiner Hintergrund meines Wunsches:

    Ich habe zwei Server die an unterschiedlichen Orten sind (bei meinen Eltern und einen bei mir) und ich möchte immer wenn ich nach Hause zu meinen Eltern fahre den selben Datenbestand haben. Ich würde dann immer nur die Platte abklemmen das neue Datum setzen und eine neue leere Platte anschließen und die Platte mit den gesammelten Filmen bei meinen Eltern anschließen wo ein anderer Job automatisch per anschliesen die neuen Filme/Serien kopiert.

    So habe ich immer Lokal an meinen beiden Schlaforten die gleiche Datenbasis.

    Wenn es hier zur Lösung kommt kann ich auch alles als Anleitung zusammenfassen. Gibt sicher einige die sich das so wünschen :).

    Viele Grüße
    Seger

  • ich schreibe es gern nochmal, die Pakete können das leider so nicht per „ab einen Datum“. Aber wenn es geht dann gern her mit der Anleitung, vielleicht hab ich die ja nicht gefunden. Aber bitte kein Verweis auf Pakete, die habe ich mir alle angeschaut und wie gesagt nichts gefunden.

    Bis jetzt ist noch das Skript die Lösung ...

    Kennt ihr das, will will will weiter machen zu basteln, aber ich komme nicht weiter und brauche nicht nur Hilfe sondern womöglich die Lösung :)?! *P

    Viele Grüße
    Seger

    Einmal editiert, zuletzt von Seger (24. Februar 2018 um 23:17)

  • verschiebt alle Dateien + alle Unterordner die älter als 100 Tage sind
    find /Quell/Ordner -mtime +100 -exec mv "{}" /Ziel/Ordner/ \;

    zum testen das ganze das es nur eine Liste mit Dateien anzeigt die verschoben werden
    find /Quell/Ordner -mtime +100 -exec ls -l "{}" /Ziel/Ordner/ \;

  • find /Quell/Ordner -mtime +100 -exec ls -l "{}" /Ziel/Ordner/ \;

    Da kann man den Zielordner aber weglassen (glaube ich). Dann zeigt er erstmal nur die Liste der Dateien an, mit denen etwas gemacht werden soll.

    ggf kann man das auch einfach in eine Datei umlenken:

    find /Quell/Ordner -mtime +100 -exec ls -l "{}" > test.txt \;


    Es kommt dann noch drauf an, ob das Linux auf der Synology "find" so gut beherrst. Daher würde ich, wie schon gesagt, das ganz auf einem Rechner mit mounts machen. Falls das Linux auf der Synology das alles so beherrst, dann ist das grundlegend der richtige Weg.

    Fehlt halt nur der Check nach existierenden Ordnern und dass sie bei Bedarf überschrieben werden sollen.

    Da auch nur nach Ordnern gesucht werden soll und dann auch noch gecheckt werden soll ob der Ordner auf dem externen Gerät existiert, muss man da etwas mehr Hand anlegen,,,


    Das ist aber jetzt mal nur so auf die Schnelle zusammen gestrickt und nicht getestet. Also bitte mit Vorsichtig genießen. Das soll nur mal kurz zeigen, was ungefähr gemacht werden muss

    Wir lesen mit "while ... read" jeden einzelnden Ordner und rufen dann mit dem Namen des Ordners die "copy_funtion" auf. Diese checkt ob der Ordner schon existiert " if [ -d "$1" ]" und wenn ja, dann mache nichts "continue" und wenn nicht, dann kopiere rekursiv ans Ziel "cp -R /Ziel"

    Aufegerufen werden müsste das Script mit: scriptname <anzahl der Tage>

    Das nur mal so in der Theorie.

    2 Mal editiert, zuletzt von DaVu (25. Februar 2018 um 08:57)

  • Da kann man den Zielordner aber weglassen (glaube ich). Dann zeigt er erstmal nur die Liste der Dateien an, mit denen etwas gemacht werden soll.

    Also ich habe diesen Code mal getestet, aber da kommt leider keine "test.txt" Datei im Pfad.

    Der Find Befehl funktioniert auf jeden Fall, da ich bereits ein Skript habe wo der Befehl enthalten ist und funktioniert.

    Beispielcode der mit "find" der läuft:

    Bash
    #!/bin/sh
    find /volume1/DiskStation/Filme -type f -regex ".*\.\(mkv\|mp4\|mpeg\|avi\)" | sort | tr '\r' '\r\n' > /volume1/DiskStation/liste.csv

    Im Grunde habe ich überhaupt keine Ahnung und ich tue mich schon sehr schwer überhaupt die Codezeilen mit meinen Daten zu füttern, sorry da muss ich echt an die Hand genommen werden.

    Ist da vielleicht noch ein Fehler vorhanden? Beim anderen Code weiß ich überhaupt wo ich überall was eintragen soll:



    Zeile 2 was ändern oder doch Zeile 3?
    Pfad ist klar, aber bei "days" in Zeile 3 z.B. noch "+100" eintagen?

    Entschuldigt das große Theater.

    Ich würde auch gern auf ein fixes Datum gehen sonst weiß ich ja irgendwann nicht mehr was ich schon alles habe.

    Also es sind 4 Pfade:

    /volume1/DiskStation/- Filme
    /volume1/DiskStation/- Filme x265 (Neu Test)
    /volume1/DiskStation/- Kinderfilme
    /volume1/DiskStation/- Serien

    Die alle nach einem definierten Datum durchgesucht werden sollen und wenn neuer als z.B. 20.02.2018 diese Daten dann in der selben Form (Ordnerstruktur) auf folgende Quelle kopiert werden sollen:

    /USB-Fesplatte/- Filme
    /USB-Fesplatte/- Filme x265 (Neu Test)
    /USB-Fesplatte/- Kinderfilme
    /USB-Fesplatte/- Serien

    Danke für die tatkräftige Unterstützung

    3 Mal editiert, zuletzt von Seger (25. Februar 2018 um 11:05)


  • Das ist aber jetzt mal nur so auf die Schnelle zusammen gestrickt und nicht getestet. Also bitte mit Vorsichtig genießen. Das soll nur mal kurz zeigen, was ungefähr gemacht werden muss

    Wir lesen mit "while ... read" jeden einzelnden Ordner und rufen dann mit dem Namen des Ordners die "copy_funtion" auf. Diese checkt ob der Ordner schon existiert " if [ -d "$1" ]" und wenn ja, dann mache nichts "continue" und wenn nicht, dann kopiere rekursiv ans Ziel "cp -R /Ziel"

    Aufegerufen werden müsste das Script mit: scriptname <anzahl der Tage>

    Das nur mal so in der Theorie.


    Hey mein Lieber,

    ich glaube du hast es mir bereits geschrieben, aber ich checke es nicht ganz. Hab mich in einem anderem Forum ein wenig schlauer machen lassen und hab dort jemanden gefunden, der mir schon ein wenig auf die Sprünge geholfen hat, aber mir fehlt es einfach an Wissen um es zu zusammen zu kopieren. Der nette Kontakt hat noch die Datumsdefinition per:

    Code
    -newermt "2018-02-22"


    ist Spiel gebracht. Darüber hinaus hab ich jetzt verstanden, dass ich mit "" meinen Pfad einschließen muss damit die Leerzeichen eingefangen werden. Der folgende Code bringt jetzt schon das angestrebte Ergebnis:


    Code
    find "/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)" -newermt "2018-02-22" -exec ls -l "{}" > "/volume1/DiskStation/Emby Testumgebung/test2.txt" \;

    Nun bekomme ich es aber nicht hin alles in ein Skript zusammen zu fassen, kannst du mir mit der neuen Datumsfunktion vielleicht was zusammenkopieren?

    Rahmenbedingungen:

    Es gibt 4 Quellpfade die würde ich gern oben im Skript einmal setzen.
    Es gibt 1 Zielpfad "/USB-Fesplatte/" (hier müsste die originale Ordnerstruktur angelegt werden von den Quellen)

    Bedingung: Wenn Dateien bereits vorhanden und neuer, dann überspringen und nicht kopieren, sonst kopieren.

    Ergebnis mit allen Kopien in ein Log auf "/USB-Fesplatte/LOG.txt" anlegen (es wäre schön wenn das Log immer Datum und nur die kopierten Pfade auflistet) - da kann man bestimmt das hier nehmen oder?:

    Code
    | sort | tr '\r' '\r\n'

    Ich würde mich freuen, wenn mir das jemand erstellen würde, und mit das fertig gepostete Skript erklärt, damit ich ein wenig lerne.

    DANKE DANKE DANKE

    Seger

  • Update:
    Es wird bereits ausgeführt :-), jetzt geht es um die Copy Funktion und der Feintuning anhand der unten aufgeführten Rahmenbedingungen.
    Weiteres Update: Er kopiert zwar, aber irgendwie nicht das Find bzw. das Datum berücksichtigt:

    Bash
    #!/bin/bash
    find "/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)" -newermt "2018-02-22" -exec mv "{}" "/volumeUSB1/usbshare" > "/volumeUSB1/usbshare/Log.txt" \;


    Rahmenbedingungen:


    Es gibt 4 Quellpfade die würde ich gern oben im Skript einmal setzen.
    Es gibt 1 Zielpfad "/USB-Fesplatte/" (hier müsste die originale Ordnerstruktur angelegt werden von den Quellen)


    Bedingung: Wenn Dateien bereits vorhanden und neuer, dann überspringen und nicht kopieren, sonst kopieren.


    Ergebnis mit allen Kopien in ein Log auf "/USB-Fesplatte/LOG.txt" anlegen (es wäre schön wenn das Log immer Datum und nur die kopierten Pfade auflistet) - da kann man bestimmt das hier nehmen oder?:


    Code
    | sort | tr '\r' '\r\n'

    Ich würde mich freuen, wenn mir das jemand erstellen würde, und mit das fertig gepostete Skript erklärt, damit ich ein wenig lerne.

    Einmal editiert, zuletzt von Seger (4. März 2018 um 12:52)

  • Ich bin mir unsicher, ob ich diese Woche dazu komme. Tut mir leid, wenn ich dich da vertrösten muss, aber diese Woche wirds ein wenig hektisch hier.

  • Ich bin mir unsicher, ob ich diese Woche dazu komme. Tut mir leid, wenn ich dich da vertrösten muss, aber diese Woche wirds ein wenig hektisch hier.

    Moin meine Lieben,

    durch einen super genialen Kontakt im Synology Forum bin ich/wir ein ganzes Stück vorangekommen. Die Grundfunktion mit dem "ab Datum" läuft schon, die Erweiterung mit mehreren Pfaden und entsprechendes setzen von Variablen folgt nachdem wir die Grundzeile fertig haben. Nun habe ich ein Punkt wo wir/ich ein wenig stocke. Und zwar beim Log.txt. Es wird zwar eine Log.txt erstellt, doch diese bleibt leider leer, weiß jemand vielleicht wieso und wo ich den Code vielleicht verändern muss?

    Anbei den momentane Code:


    Bash
    #!/bin/bash
    cd "/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)" && find -type f -newermt "2018-02-22" -exec cp -u --parents "{}" "/volumeUSB1/usbshare/- Filme x265 (Neu Test)/" 2> "/volumeUSB1/usbshare/Log.txt" \;

    Würde mich freuen, wenn jemand hier eine zündende Idee hat.

    Viele Grüße
    Seger

  • Moin meine Lieben,
    durch einen super genialen Kontakt im Synology Forum bin ich/wir ein ganzes Stück vorangekommen. Die Grundfunktion mit dem "ab Datum" läuft schon, die Erweiterung mit mehreren Pfaden und entsprechendes setzen von Variablen folgt nachdem wir die Grundzeile fertig haben. Nun habe ich ein Punkt wo wir/ich ein wenig stocke. Und zwar beim Log.txt. Es wird zwar eine Log.txt erstellt, doch diese bleibt leider leer, weiß jemand vielleicht wieso und wo ich den Code vielleicht verändern muss?

    Anbei den momentane Code:


    Bash
    #!/bin/bash
    cd "/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)" && find -type f -newermt "2018-02-22" -exec cp -u --parents "{}" "/volumeUSB1/usbshare/- Filme x265 (Neu Test)/" 2> "/volumeUSB1/usbshare/Log.txt" \;

    Würde mich freuen, wenn jemand hier eine zündende Idee hat.

    Viele Grüße
    Seger

    Ich glaube ich habe es selbst herausgefunden es fehlte die Option

    -v oder --verboseDurchgeführte Tätigkeiten "erklären" / anzeigen


    Jetzt sieht es so aus:


    Bash
    #!/bin/bash
    cd "/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)" && find -type f -newermt "2018-02-22" -exec cp -uv --parents "{}" "/volumeUSB1/usbshare/- Filme x265 (Neu Test)/" 2>> "/volumeUSB1/usbshare/Fehler.txt" 1>> "/volumeUSB1/usbshare/Log.txt" \;

    jetzt werde ich mich dem Log.txt widmen um das sauber zu machen, danach steht das setzen der Variablen an und die Integration von mehreren Pfaden. Wenn da jemand unterstützen kann, würde ich sehr über Hilfe freuen.

    Viele Grüße
    Seger

  • Ich bin mir unsicher aber diese Umlenkung 2> "/volumeUSB1/usbshare/Log.txt" bedeutet ja, dass die Ausgabe von stderr in die Datei gelenkt wird. Also immer dann wenn ein Fehler auftritt.


    Die Datei sollte sich füllen, wenn du die Zahl davor weg nimmst. Wenn du sie zu einer "1" änderst werden alle korrekten Dinge eingefügt.


    Beispiel:


    Du machst als normaler user einen find auf das komplette System. Dann bekommst du teilweise Fehlermeldungen, dass du zu gewissen Orndern keinen Zugriff hast. Das ist dann die Fehlermeldung die als Ausgabe "stderr" hat. Alle anderen werden als "stdout" bezeichnet. "stderr" = 2 .... "stdout" = 1


    Siehe auch:


    http://openbook.rheinwerk-verlag.de/shell_programm…4004D721F04817A


    Edit:

    Zu langsam. Das mit der "1" hast du schon selbst gefunden ;)

  • Alles gut, hab gerade den Post aktualisiert, es lag wie oben erwähnt an der fehlenden Option, jetzt wird was ausgegeben.

    Mein Aktueller stand:

    Jetzt sieht es so aus:

    Bash
    #!/bin/bash
    cd "/volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test)" && find -type f -newermt "2018-02-22" -exec cp -uv --parents "{}" "/volumeUSB1/usbshare/- Filme x265 (Neu Test)/" 2>> "/volumeUSB1/usbshare/Fehler.txt" 1>> "/volumeUSB1/usbshare/Log.txt" \;

    Offtopic:
    Anbei sende ich dir mal das entstandene Testlog:

    Code
    ./Jumper (2008) -> /volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)
    './Jumper (2008)/Jumper (2008).nfo' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/Jumper (2008).nfo'
    './Jumper (2008)/Jumper (2008).mkv' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/Jumper (2008).mkv'
    ./Jumper (2008)/@eaDir -> /volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/@eaDir
    './Jumper (2008)/@eaDir/Jumper (2008).mkv@SynoEAStream' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/@eaDir/Jumper (2008).mkv@SynoEAStream'
    './Jumper (2008)/clearart.png' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/clearart.png'
    './Jumper (2008)/banner.jpg' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/banner.jpg'
    './Jumper (2008)/logo.png' -> '/volumeUSB1/usbshare/- Filme x265 (Neu Test)/./Jumper (2008)/logo.png'

    Weißt du ob es schon eine Lösung für diese "/@eaDir/" Ordner gibt? Die würde ich gern überhaupt nicht auf meiner Synology haben wollen.
    Ich bekomme die nicht weg. Wenn man die nicht weg bekommt, kann man ja vielleicht im Log oder im Find die Ordner ausschließen (aber wenn alles zu kompliziert lasse wir das alles lieber).


    Ich mache mich jetzt mal ans Sortieren des Logs und evtl. anpassen mit Datumsangabe etc.


    Wollen wir vielleicht auf Basis des Codes jetzt die anderen 3 Quellen hinzufügen und anschließend Form reinbringen durch setzen der Variablen? Ich würde mich sehr freuen wenn du mir wieder erklärend unter die Arme greifst.


    Danke und viele Grüße
    Seger

  • Das, was ich so auf anhieb sehe ist, dass das find-commando keinen Startpunkt übergeben wird.

    Normalerweise baut man den Befehl 'find' wie folgt auf:

    find <wo> <typ> <weitere parameter wie Name, Zeit etc....> -exec <mache irgendwas>

    Wenn du schon in einen spezifischen Ordner wechselst, dann würde ich nach dem Wort "find" noch einen "." setzen. Dieser besagt, dass er ausschließlich ab dem Pfad rekursiv suchen soll.

    den "cd"-Befehl kannst du dir auch sparen, wenn du find wie folgt anpasst:

    find /volume1/DiskStation/Emby Testumgebung/- Filme x265 (Neu Test) blablabla.....

    Weiter würde ich dir empfehlen, wenn du unter Linux Dateien suchst, auf Leerzeichen komplett zu verzichten. Das kann ganz unerwünschte Nebeneffekte haben, wenn sie nicht sauber escaped wurden. Anstelle von Leerzeichen verwende ich immer Unterstriche "_". Dateinamen, die dann länger sind, sehen bei mir wie folgt aus:

    "Herr_der_Ringe-Die_gefaerhten"

    "ä", "ö" und "ü" könnte auch spannend werden, wenn sich sowas im Dateinamen befindet, weswegen ich da auch komplett drauf verzichte.

    Um einen Ordner auszuschließen (den @eaDir, zum Beispile), könntest du oben die "while"-schleife verwenden und in der Funktion darunter nach "pwd" checken und innerhalb der Ausgabe von "pwd" nach dem String "@eaDir" suchen. Wenn der String gefunden wird, dann "continue", wenn nicht, dann weiter im Text und die Ausgabe in die log-Datei schreiben.

    Gut, wenn es so schon mal läuft. Ganz wasserdicht ist der Befehl dennoch noch nicht ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!