Batch Script Datum vergleichen...wer hat eine Idee

dominik_pizzo

Cadet 2nd Year
Registriert
Dez. 2013
Beiträge
30
Hallo zusammen, mein erster Beitrag hier yeahii :D

ehm ich habe eine Frage an euch...vielleicht hat ja jemand von euch eine Idee :)

Also es geht darum, dass ich ein Script geschrieben habe unter Debian , dass Bilder von einem Ordner in einen anderen verschiebt und dabei Skaliert. Funktioniert alles wunderbar.

Doch ich würde noch eine verbesserung einbauen...

Und zwar soll dass Script als erstes Täglich um 23 Uhr laufen (wahrscheinlich über ein Cronjob).
Soo nun der Knackpunkt dabei ist dass script soll nur Saklieren wenn es eine neue Bilddatei gibt oder diese geändert wurde also sollte das script erkennen ob eine datei im Ordner hinzugefügt wurde oder das Datum einer Datei in dem Ordner = heute ist. Wenn nicht soll dass Programm sich einfach beenden.

Dass heißt also nochmal in kurz:
- Prüfe Anzahl und Datum der Dateien in Ordner
- Falls Anzahl anderst als am Tag davor dann Sakliere
- Falls Datum = heute dann Skaliere.
- Falls alles gleich dann beende Programm


Ich muss dazu sagen ich bin absoluter neuling im Scripten.

Also liebe Grüße Dominik!!!! :)


-----
Falls das Thema falsch liegt dann könnte man es Bitte verschieben :o
 
Zuletzt bearbeitet:
wie wäre es wenn du einfach das synchronisieren der Ordner mit rsync erledigst und dann die Ausgabe von rsync nimmst für die weitere Verarbeitung, also das skalieren.
 
Hey Fonce..
Ich habe halt den Ordner A wo die Ursprungsbilder drin sind, die werden dann in Ordner B hinenkopiert bzw skaliert.
Im Ordner A werden dann neue Bilddateien abgelegt und die sollen dann in den Ordner B skaliert werden.
Also bin ich gerade am Überlegen, mit welchen Ordner ich mit der funktion rsync den Ordner A vergelichen soll....also bisschen schwer mir rsync oder?

Grüße
 
Du könntest folgendes machen:
Liste der Dateien mit z.B.
Code:
ls -al --time-style="+%Y%m%d%H%M" | awk '{ print $6, $7 }'
in eine Datei schreiben (in einem Verzeichnis, auf das Du Schreibzugriff hast).

Code:
#!/bin/bash
SAVEIFS=${IFS}
IFS=$(echo -en "\n\b")   ##Feldtrenner auf "newline" setzen
for FILE in $(ls -al --time-style="+%Y%m%d%H%M" | awk '{ print $6, $7 }'); do
   DATUM_ALT=$(cat ${LISTE} | grep $(echo ${FILE} | awk '{ print $2 }') | awk '{ print $1 }') ##Datei ${LISTE} nach ${FILE} durchforsten und erstes Feld (Dateidatum) ausgeben
   DATUM_NEU=$(echo ${FILE} | awk '{ print $1 }') ##aktuelles Dateidatum
   if [[ ${DATUM_ALT} -lt ${DATUM_NEU} ]] || [[ -z ${DATUM_ALT} ]]; then ## Wenn Datum_alt kleiner als Datum_neu oder Datum_alt=0
       #hier die aktion für neue Bilder einfügen
   fi
done
IFS=${SAVEIFS}

So oder so ähnlich. Testen darfst Du selber, für Funktion gibt's keine Garantie (bin mir ziemlich sicher, daß daran noch ein wenig herumgefeilt werden muß).

Ach ja, und es ist übrigens ein bash-script, kein batch-script. Sagst Du nochmal batch, wirst Du gebashed. Batch findest Du irgendwo bei Billy Boy Gates.:rolleyes:

Wenn Du es soweit funktionsfähig hast, kannst Du die Liste am Ende der Anweisungen mit neuen Daten überschreiben, um daraus einen cron-Job zu machen. Oder Du schaust Dir "incron" mal an.
 
Zuletzt bearbeitet:
Cool danke des kommt doch schon mal näher an dass ran was ich mir vorstelle :) ich probiers mal morgen aus und sag Bescheid obs läuft :)

------
Edit:

Haha alles klar ich werds nurnoch beim richtigen Namen nenen ;) Jo des Programm schau ich mir mal an ^^
 
Zuletzt bearbeitet:
dominik_pizzo schrieb:
Script geschrieben habe unter Debian , dass Bilder von einem Ordner in einen anderen verschiebt und dabei Skaliert. Funktioniert alles wunderbar.
...
Soo nun der Knackpunkt dabei ist dass script soll nur Saklieren wenn es eine neue Bilddatei gibt oder diese geändert wurde

Wenn die Bilder beim Skalieren sowieso in einen anderen Ordner verschoben werden, sind doch zwangsweise alle Dateien im Quellordner neu und müssen der Skalierung (+Verschiebung in den anderen Ordner) unterzogen werden, wenn 23 Uhr der cron-job rennt. Wozu sollte man da noch irgendwelche Zeiten testen?

BTW:
Zeitvergleiche in Shellskipten - falls du sowas doch brauchst - will man möglichst nicht mit solchen manuellen Rechnungen machen wie Twostone. find(1) kennt verschiedene Optionen, Dateien eines bestimmten Alters auszuwählen. Entweder nach fester Zeit suchen (find -daystart -cmin x ...) oder im Skript heute ein File als Lock erzeugen (touch lock) und die Bild-Dateien morgen mit "find -cnewer lock" automatisch mit dem lock-File vergleichen lassen.
 
Zuletzt bearbeitet:
Naja da geht halt um ein Überwachungssystem dass halt ab und zu ne neue .jpg datei bekommt bzw. angepasst wird....aus performancegründen sollte das script halt nur laufen wenn wirklich was neues dabei ist :D is ein etwas größerer Server wo das script läuft ^^
 
dominik_pizzo schrieb:
aus performancegründen sollte das script halt nur laufen wenn wirklich was neues dabei ist

In diesem Punkt wäre dann wohl incron so ziemlich das, was Du suchen würdest. Damit kannst Du das Verzeichnis überwachen und bei Änderung oder Neuerstellung einer Datei vorher definierte aktionen durchführen lassen. Wie cron halt auch, nur eben nicht Zeit- sondern event-basiert.

Übrigens ist es sinnvoll, das dem Verzeichnis zugrunde liegende Dateisystem mit der Option "noatime" zu mounten, da sonst selbst ein "ls" der Datei eine neue Zugriffszeit verpasst. Merkte dies, als meine stündlichen snapshots weit mehr Speicherplatz referenzierten, als meine Aktionen im Dateisystem es eigentlich gerechtfertigt hätten.

mensch183 schrieb:
Zeitvergleiche in Shellskipten - falls du sowas doch brauchst - will man möglichst nicht mit solchen manuellen Rechnungen machen wie Twostone.

Irgendwo her brauchte ich eine Referenz. Die Idee war in fünf Minuten aus der Luft gegriffen. Tatsächlich macht find eigentlich auch nichts anderes als "Zahlenvergleiche". Der einzige Vorteil liegt darin, daß der Befehl, den mein eintippen muß, ein wenig kürzer ist und man auch nicht noch ein zweites Programm braucht, um das array zu kürzen (wobei man durchaus auch mit $array[element] hätte arbeiten können).
Es ist, zugegebenermaßen, nicht die eleganteste und schnellste Lösung.
 
In diesem Punkt wäre dann wohl incron so ziemlich das, was Du suchen würdest. Damit kannst Du das Verzeichnis überwachen und bei Änderung oder Neuerstellung einer Datei vorher definierte aktionen durchführen lassen. Wie cron halt auch, nur eben nicht Zeit- sondern event-basiert

Auch eine super Idee...also ich probier des dann auch mal aus auf meinem Testsystem...
ehm bei dem Script hat er mit noch ausgegeben

Aufruf: grep [OPTION]... MUSTER [DATEI]...
>> grep --help<< gibt Ihnen mehr Informetionen.
 
mal mit bash -x ${script} ausführen und schauen, wo der Fehler liegt.
 
Aalso der incron kommt leider nicht infrage....hat beim testen mein Testsystem zum abstürzen gebracht...beim bilder reinkopieren in der überwachten Ordner hat die Kiste sich aufgehängt.. :/ naja jetzt probier ich weiter an dem Script :D
 
um mal einen Tip aufzugreifen:

Code:
#!/bin/bash
if [ -f ./lock ] then
   find $PWD -cnewer ./lock -type f -ls -exec ${scalierscript} {} \;
else
   find $PWD -type f -ls -exec ${scalierscript} {} \; ## wird nur beim ersten Ausführen gebraucht, wenn ./lock noch nicht vorhanden
fi
if  [ ! $? -ne 0 ]; then
   touch lock
else
   echo "fehler"
fi
 
Zuletzt bearbeitet:
okee :D haha ich versuch mich mal durchzuarbeiten... schade dass so ein script nicht einfach ganz simple sein kann like:
if datum = heute dann führe aus
else exit

Düfte sowas Primitives auch funktionieren?
 
Nichts anderes war ja die erste Variante. Die zweite mit find ist auch nichts anderes, nur kürzer, und auf eine etwas andere Art und Weise. Komplex sind beide Varianten nicht.
 
Warum alles so kompliziert?

find /verzeichnis/mit/bilder -name "*.jpg" -mtime -1 -print0 | xargs -0 /dein/skalierungs/script


find findet alle *.jpg Dateien die innerhalb des letzten Tages erstellt oder modifiziert wurden, und uebergibt die Dateinamen einzeln an xargs
/dein/skalierungs/script sollte als $1 halt den Dateinamen erwarten

Dank "print0 und xargs -0" hast auch keine Probleme mit bescheuerten Dateinamen ;)
 
Ulukay....ich werds ausprobieren...vielen dank dass ihr euch die mühe macht :D
Soll ich dann deine Idee imprinziep als einzelnes Script laufen lassen oder mit in mein Script hinenbasteln? bzw was wäre Sinnvoller? :D
 
Zuletzt bearbeitet:
Code:
if find /usr/local/nagvis/share/userfiles/images/maps/ -name "*.jpg" -mtime -1 -print0 | xargs -0; then


Skript
bla bla bla
Skript

else
exit
fi


so hätte ich dass jetzt gemacht :D is wahrschlich grottenfalsch weil das script immernoch die älteren Bilder Skaliert
:pcangry:
 
Ja das ist komplett falsch!

nach "xargs -0" muss direkt das kommando kommen, welchem du den Dateinamen uebergeben willst

Kein If, kein then usw...
 
könnt ich den ganzen kram eigentlich auch in ne if abfrage reinpacken?
also so zum beispiel
Code:
 #!/bin/bash
 if [ find -mtime -1 ]; then

skript blablablubber

else
echo keine neuen  daten
fi
 
Zuletzt bearbeitet:
Zurück
Oben