[gelöst] - for file in ... nur für bestimmte Endungen?

Diskutiere [gelöst] - for file in ... nur für bestimmte Endungen? im Shell-Skripte Forum im Bereich Programmieren unter Linux/Unix; Hallo Zusammen Ich habe einen eigenen Server und das Ziel mittels einem Shell-Skript ein Verzeichnis auf neue Dateien zu überprüfen. Das Skript...

  1. #1 UwBeInter, 04.07.2017
    UwBeInter

    UwBeInter Jungspund

    Dabei seit:
    04.07.2017
    Beiträge:
    11
    Zustimmungen:
    0
    Hallo Zusammen

    Ich habe einen eigenen Server und das Ziel mittels einem Shell-Skript ein Verzeichnis auf neue Dateien zu überprüfen. Das Skript durchsucht das Verzeichnis auf neu vorhandene Dateien und schreibt diese dann in eine Liste, damit nur die neusten welche noch nicht in der Liste stehen geprüft werden.

    So kann ich jeweils prüfen lassen ob neue Dateien hinzugekommen sind. Gerne würde ich eine E-Mail versenden lassen sobald eine neue Datei vorhanden ist. Das funktioniert derweil gut, allerdings zerbreche ich mir nur noch wegen einem Problem den Kopf, weil ich womöglich zu weit studiere.

    Aktuelles Problem: Bei jeder einzelnen neuen Datei wird eine E-Mail ausgelöst. Sprich es sind z.b. 10 neue Dateien im Ordner, dann erhalte ich auch 10 E-Mails.

    Gewünschte Lösung: Die Prüfung soll nach wie vor stattfinden, jedoch sollte bei jeder Prüfung (falls neue Dateien vorhanden sind) jeweils nur 1 E-Mail gesendet werden, egal ob 1 Neue oder 10 Neue Dateien.

    Hier mal das erwähnte Skript:
    Code:
    for file in ${dir}/weather_reports/images/*
    do
            [[ "$file" =~ handled_img.dat ]] && continue
            if grep -w "$file" "${dir}/handled_img.dat" > /dev/null 2> /dev/null
            then
                    continue
            fi
            mailx -a "From: UwBe International <info@uwbeinternational.ch>" -s "Neue Bilder auf dem FTP vorhanden" info@unwetterbeobachtung.ch < "mail_info.txt"
            printf "%s\n" "$file" | tee -a "${dir}/handled_img.dat"
    done

    Hat jemand hier einen Tip wie ich das lösen könnte?
    Danke und Grüsse aus der Schweiz
    Dominic
     
  2. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.242
    Zustimmungen:
    19
    mach anstatt des mailx eine Statusvariable an der Stelle rein und prüfe die nach der Schleife - wenn gesetzt - mail versenden, wenn nicht - dann halt nicht.
     
    UwBeInter gefällt das.
  3. #3 UwBeInter, 04.07.2017
    UwBeInter

    UwBeInter Jungspund

    Dabei seit:
    04.07.2017
    Beiträge:
    11
    Zustimmungen:
    0
    Das habe ich mir auch schon gedacht und da ich nicht viel Ahnung mit BASH habe und vom PHP her komme, versuchte ich es so zu lösen:

    Code:
    for file in ${dir}/var/www/vhosts/uwbeinternational.ch/httpdocs/weather_reports/images/*
    do
    [[ "$file" =~ handled_img.dat ]] && continue
    if grep -w "$file" "${dir}/handled_img.dat" > /dev/null 2> /dev/null
    then
    var_mail = 1
    continue
    fi
    printf "%s\n" "$file" | tee -a "${dir}/handled_img.dat"
    done
    if [ $var_mail -eq 1 ]
    then
    mailx -a "From: UwBe International <info@uwbeinternational.ch>" -s "Neue Bilder auf dem FTP vorhanden" info@unwetterbeobachtung.ch < "mail_info.txt"
    fi 
    das "var_mail = "0" am Anfang oder so klappt nicht, dann kommt Fehler "Kommando unbekannt" oder beim obigen Code folgende Meldung:
    ./chk_new_files_img.sh: Zeile 6: var_mail: Kommando nicht gefunden.
    ./chk_new_files_img.sh: Zeile 6: var_mail: Kommando nicht gefunden.
    ./chk_new_files_img.sh: Zeile 10: [: -eq: Einstelliger (unärer) Operator erwartet.
     
  4. #4 UwBeInter, 04.07.2017
    UwBeInter

    UwBeInter Jungspund

    Dabei seit:
    04.07.2017
    Beiträge:
    11
    Zustimmungen:
    0
    Ich komme der Sache schon näher. Jetzt habe ich var = 0 wenn keine neuen Dateien da sind, ansonsten ist die var so hoch wie die neuen Dateien. Dann kann ich eine Abfrage machen ob var gleich gross oder grösser als 1 ist um somit dann nur 1 mail auszulösen.

    Code:
    var=0
    for file in ${dir}/weather_reports/images/*
    do
            [[ "$file" =~ handled_img.dat ]] && continue
            if grep -w "$file" "${dir}/handled_img.dat" > /dev/null 2> /dev/null
            then
                    continue
            fi
                    var=`expr $var + 1`
                    printf "%s\n" "$file" | tee -a "${dir}/handled_img.dat"
    done
    echo $var
    if [ $var -gt || -eq 1 ]
    then
            # mailx -a "From: UwBe International <mail@domain.tld>" -s "Neue Bilder auf dem FTP vorhanden" info@domain.tld < "mail_info.txt"
    fi

    Nur ergibt mir jetzt der folgende Fehler keinen Sinn:
     
  5. #5 UwBeInter, 04.07.2017
    UwBeInter

    UwBeInter Jungspund

    Dabei seit:
    04.07.2017
    Beiträge:
    11
    Zustimmungen:
    0
    Problem gelöst! ;)
    So funktioniert es jetzt super:

    Code:
    var=0
    for file in ${dir}/weather_reports/images/*
    do
            [[ "$file" =~ handled_img.dat ]] && continue
            if grep -w "$file" "${dir}/handled_img.dat" > /dev/null 2> /dev/null
            then
                    continue
            fi
            var=`expr $var + 1`
            printf "%s\n" "$file" | tee -a "${dir}/handled_img.dat"
    done
    echo $var
    if [ $var -gt 1 -o $var -eq 1 ] ;
    then
        mailx -a "From: UwBe International <info@domain.tld>" -s "Neue Bilder auf dem FTP vorhanden" info@domain.tld < "mail_info.txt"
    fi
     
  6. #6 UwBeInter, 05.07.2017
    UwBeInter

    UwBeInter Jungspund

    Dabei seit:
    04.07.2017
    Beiträge:
    11
    Zustimmungen:
    0
    Obiges Skript funktioniert nun ganz gut. Doch wenn ich zb. nur alle Dateien mit der Endung ".mp4" auslesen möchte und der Rest ignoieren, dann hab ich mal for file in $dir.../*.mp4 geschrieben. Leider klappt das aber nicht , weil der mir dann immer *.mp4 in die handled.img.dat schreibt.

    Kann ich hier irgendwie bewirken dass das Verzeichnis nur nach *.mp4 durchsucht wird?
     
  7. #7 hellfire, 05.07.2017
    Zuletzt bearbeitet: 05.07.2017
    hellfire

    hellfire Doppel-As

    Dabei seit:
    25.05.2016
    Beiträge:
    129
    Zustimmungen:
    15
    Du kannst vor dem anfügen an die handled.img.dat prüfen ob die Datei überhaupt existiert. Wenn das Muster nicht auf eine existierende Datei passt, dann wird das Muster nicht aufgelöst.

    Also so z. B.:

    Code:
    # normale if-Abfrage
    if [ -f "$file" ] ; then
      echo "$file" >> "${dir}/handled_img.dat"
    fi
    
    # verkürzte Abfrage
     [ -f "$file" ]  && echo "$file" >> "${dir}/handled_img.dat"



    Der printf ist zwar sehr nützlich für formatierte Ausgaben. Hier reicht aber ein simples echo.

    Code:
    printf "%s\n" "$file"
    
    # ist identisch mit...
    echo "$file"
    
    Auch der tee -a ist hier mehr Schreibarbeit, als sich der faule Systemadminstrator vielleicht wünscht.
    Code:
     befehl | tee -a "$file"
    
    # ist identisch mit...
    befehl >>"$file"
    
     
    UwBeInter gefällt das.
  8. #8 UwBeInter, 05.07.2017
    UwBeInter

    UwBeInter Jungspund

    Dabei seit:
    04.07.2017
    Beiträge:
    11
    Zustimmungen:
    0
    Ja das ist mir schon klar, es geht ja nicht darum dass eine Datei existiert oder nicht, sondern dass er generell im Vereichnis nur nach Dateien mit der Endung .mp4 suchen soll und nichts anderes. :)

    Habe es jetzt aber so gelöst dass die Thumbs der Videodateien in einem separaten Verzeichnis gespeichert werden, was somit dieses Script nicht mehr tangiert.

    Danke trotzdem für Deine und Eure Inputs. :)
     
  9. marce

    marce Kaiser

    Dabei seit:
    01.08.2007
    Beiträge:
    1.242
    Zustimmungen:
    19
    mit
    Code:
    find
    wäre das komplette Konstrukt wohl wesentlich eleganter zu lösen.
     
    UwBeInter gefällt das.
Thema:

[gelöst] - for file in ... nur für bestimmte Endungen?

Die Seite wird geladen...

[gelöst] - for file in ... nur für bestimmte Endungen? - Ähnliche Themen

  1. [GELÖST] perl; rmtree; logfile

    [GELÖST] perl; rmtree; logfile: Hallo, ich möchte gerne die Ausgabe der "rmtree" Funktion mitloggen. manpage: rmtree() Wie Ihr sehen könnt ist der 2 parameter "TRUE". Mir...
  2. [GELÖST] Firefox; Filetype Zuordnung

    [GELÖST] Firefox; Filetype Zuordnung: Hallo Forum, bin beim schreiben eben selber auf die Lösung gekommen. Mein Problem war das ich im Firefox/Iceweasel ein Dateityp einer Anwendung...
  3. [gelöst] TAN-Generator Kaufempfehlung

    [gelöst] TAN-Generator Kaufempfehlung: Meine Bank stellt das iTAN-Verfahren ein. Es gibt 2 Alternativen. Die erste ist mit Smartphone, die zweite mit PC und TAN-Generator. Da ich...
  4. [gelöst] bash, cut - wahrscheinlich die 1000.

    [gelöst] bash, cut - wahrscheinlich die 1000.: Hallo Forum, seit mehr als drei Tagen drehe ich mich im Kreis, da ich bei google & co augenscheinlich nicht die richtigen Fragen stelle. Mein...
  5. [gelöst] 2.HDD unter Freebsd partitionieren

    [gelöst] 2.HDD unter Freebsd partitionieren: Hallo Habe eine Testserver mit freeBSD 11.0 auf einer IDE-HDD (ada0) mit ZFS-root hab jetzt eine 2. HDd (SATA) angeschlossen und wollte die...
  1. Diese Seite verwendet Cookies um Inhalte zu personalisieren. Außerdem werden auch Cookies von Diensten Dritter gesetzt. Mit dem weiteren Aufenthalt akzeptierst du diesen Einsatz von Cookies.
    Information ausblenden