Runden in Skript

  • Hallo,


    ich nutze motion um regelmäßig (alle 5 min) Fotos mit meiner Webcam zu machen.
    Davon möchte ich später ein Zeitraffervideo machen.
    Jedes x-te Foto möchte ich aber auch auf einen Server hochladen.


    Bisher habe ich das so gemacht:

    Code
    wput $srv  snapshot????????????????0*


    So wurden alle Bilder, die bei den Minuten eine 0 hatten hochgeladen (also 18:00, 18:10, ...)


    Jetzt kommen die Fotos aber nicht zuverlässig auf die volle Minute:


    Deshalb müsste ich runden.
    Oder wie würdet ihr das machen?
    Es würde auch reichen, jedes x-te Foto hochzuladen.


    Gruß,
    Hendrik

  • Oder wie würdet ihr das machen?


    Hallo,
    im Prinzip reicht ja das durchzählen der Dateien:


    Mit http://wiki.ubuntuusers.de/inotify könntest du das auch eventgesteuert machen, d.h. wenn ein neues Bild dazukommt, prüft er wie weit er gezählt hat (lässt sich ja z.B. in einer Datei zwischenspeichern) und lädt dann ggf. das neue Bild hoch.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

    Einmal editiert, zuletzt von seahawk1986 ()

  • Wenn du es ganz einfach machen willst, mach einen cron job, der alle 15 Minuten die letzte Datei kopiert.



    Dein ursprünglicher Ansatz ginge etwa so:

    Code
    file="/var/motion/snapshot_04-20110617-175958-video0.jpg"
    file="${file#*snapshot_??-}"
    secs=$((10#${file:9:2}*3600+10#${file:11:2}*60+10#${file:13:2}))


    secs ist jetzt die Anzahl Sekunden seit Mitternacht. Wenn du jede 15 Minuten ein Bild haben willst, läufst du einfach durch die Liste der Bilder, und prüfst, ob sich der Wert von $((secs/60/15)) ändert. Wenn ja, hast du die Grenze eines 15-Minuten Intervalls überschritten.


    Gruß,


    Udo

  • Hallo,


    ich bin jetzt ein Stück weiter.
    Die Dateien werden alle 15 min hochgeladen. Aber aus irgendeinem Grund fehlen manchmal Fotos.
    Ich möchte jetzt aus all den Fotos, die ich habe, das letzte jeder Stunde haben.

    Code
    20110822_112432.jpg  20110908_204000.jpg  20111019_172933.jpg
    20110822_112932.jpg  20110908_204500.jpg  20111019_174433.jpg
    20110822_113432.jpg  20110908_205000.jpg  20111019_181433.jpg
    20110822_113932.jpg  20110908_205500.jpg  20111019_182933.jpg
    20110822_114432.jpg  20110908_210000.jpg  20111019_184433.jpg
    20110822_114932.jpg  20110908_210500.jpg  20111019_185933.jpg


    Jetzt könnte ich in einer Schleife durch die Monate, Tage und Stunden gehen und ein ls machen wobei ich mit tail -n1 jeweils den letzten Eintrag filtere.


    Geht das auch eleganter?


    Gruß,
    Hendrik

  • wie wär's mit

    Code
    ls | awk '{arr[substr($0,1,11)] = $0} END{for(val in arr) print arr[val]}'


    gruss

  • Wow. Beeindruckend!
    Hätte ich nicht gedacht, oder doch... Hatte schon gedacht, dass das einfacher geht. Aber als Einzeiler?!


    Aber verstanden hab ich es noch nicht.


    Ich würde das gerne noch auf eine Variante ummünzen, wo ich die letzte Datei vor 17:00 Uhr erhalte. Aber dazu muss ich es erstmal verstehen.


    Gruß,
    Hendrik

  • hi,
    das Skript merkt sich in einem Array unter dem Index substr() den letzten Dateinamen und gibt am Ende einfach alles aus. Eigentlich sollte somit pro Stunde die jeweils letzte Datei ausgegeben werden. Ggf. noch einen sort dranhaengen.


    gruss
    Frank

Jetzt mitmachen!

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