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

U

UwBeInter

Jungspund
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
 
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.
 
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.
 
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:
./chk_new_files_img.sh: Zeile 16: Syntaxfehler beim unerwarteten Wort `fi'
./chk_new_files_img.sh: Zeile 16: `fi'
 
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
 
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?
 
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"
 
Zuletzt bearbeitet:
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. :)
 
mit
Code:
find
wäre das komplette Konstrukt wohl wesentlich eleganter zu lösen.
 

Ähnliche Themen

Crontab und Scripts - Problem

HandbrakeCLI Shell Skript

CTDB Samba Cluster als Shared Storage für MS SQl Server

Falsche Rechte gesetzt beim Anlegen von Ordnern via Samba-Client

Portknocking mit iptables

Zurück
Oben