Batch Script zum automatisierten Verschieben

Bernhardt

Newbie
Registriert
Jan. 2014
Beiträge
4
Hallo,

sorry mir ist leider kein besserer Titel eignefallen. Ich habe selbst wenig Ahnung von Unix-Scripts aber dafür ein großes Problem. ;-)

Ich bräuchte zum einen ein Script das sich bei Systemstart selbst läd, dann alle 10 Minuten einen bestimmten Y Ordner durchsucht. Falls dort eine Datei mit einer vordefinierten Endung z.B. txt erstellt wurde soll das Script weitere 10 Minuten warten und dann den kompletten Dateinamen A.text an ein Program übergeben (program A.text -u). Sobald das Program erfolgreich war, soll die Datei A.text in einen anderen Ordner X verschoben werden. Dabei ertstell das Programm selbst eine neue Datei B.text im Ordner Z.

Ein anderes Script, das ebenfalls bei Systemstart aktiviert wird, soll nun alle 10 Minuten überprüfen ob ein NAS aktiv ist. (Stehts am selben Anschluß und auch direkt mit dem Pc verbunden). Wenn das NAS hochgefahren ist und man darauf zugreifen kann, soll das Script den Ordner Z durchsuchen und falls gefunden alle Datein (auch die Datei B.text) auf das NAS verschieben und die Datei B.text in einen neuen Ordner XY verschieben.

Ich hoffe es ist einigermassen verständlich. Meine Schwierigkeit liegt nun bei dem Durchsuchen der Ordner und dem Übergeben des vollständigen Dateinamens an das Program. Auch weis ich nicht wie ich es schaffen soll alle 10 Minuten zu Prüfen ob das NAS aktiv ist. Und wie ich es schaffe die Datein zu suchen und zu Kopieren. Da ich ja nicht weis wie die Datein heißen, sondern nur das sie die gleiche Endung haben.

Ich hoffe ihr könnt mir weiterhelfen und wäre euch sehr sehr sehr :-) Dankbar

LG
Bernd
 
Zuletzt bearbeitet:
TL;DR, aber cron sollte schon mal 50% deines Problems lösen.
 
@Bernhardt
Googel mal zum Stichwort "bash Programmierung" (ja, "bash" nicht "batch"). Ich bin mir ziemlich sicher, dass viele Leute schon Skripte, wie das was du suchst, zusammengebastelt haben. Da kannst du dir bestimmt etwas abschauen.

Und ansonsten auf asdfman hören. cron ist hier echt die halbe Miete.
 
Hi,

danke für eure Links. Sorry war etwas unhöfflich ohne eigene Idee zu sagen, macht mal. ;-) War auch keine Absicht, hab da einfach nicht drüber nach gedacht. So ich habe jetzt mal etwas rumgebastelt. Programmiere normalerweise nur Java und C++ daher verzeiht den wahrscheinlich sehr untypischen Stil. ;-) Wäre super wenn ihr mir da etwas weiterhelfen könntet. Insbesondere bin ich mir bei der watch syntax nicht sicher:

#!/bin/bash

verz=test

watch -n10 "if [ ! "`ls -A $verz`" ]
sleep 10
then
var=$(ls $verz)

vLen=${#var[@]}

for (( n=0; n<${vLen}; n++ ));

do

programm ${var[$n]} ... -o \home\Ordner\${var[$n]} -

mv \$verz\${var[$n]} \home\Ordner2\${var[$n]};
done



fi"



#!/bin/bash

verz=test
watch -n10 "if ping -c 1 192.169.178.XX &> /dev/null
sleep 10

then
find $verz -name "*.txt" -exec mv {} smb://XXXXX/YYYY/ \;

done

fi"

Ich befürchte aber die Syntax passt nicht so ganz.

LG
Bernhardt
 
Kannst du uns/mir dein "hin und herschliebe"-Konzept nochmal näher erläutern. Ich habe das gefühl, dass man schon an dieser stelle feilen kann und dadurch das Script (welches du dann unbedingt als cron laufen lassen willst, wie asdfman schon schrieb) erheblich einfacher wird.
* Warum wird $datei.$endung verschoben
* Was macht $programm mit $datei.$endung
* Warum muss immer 10 min gewartet werden (damit das nas aus seinem tiefschlaf aufwacht)?
* Gut. Der letzte schritt ist die verbannung aufs nas.
 
Hi JD,
ein cron script läuft auch ohne, dass sich jemand eingelogt ist, bei Systemstart? Wenn das so ist hab ihr wirklich recht. Dann geht es nur noch um die eigentlichen Scripts... also..

Das erste welche das Programm aufruft und die Datein verschiebt:

#!/bin/bash

verz=test % Damit das ganze etwas flexibel bleibt wollte ich den Pfad einfach fest in eine Variable speichern

if [ ! "`ls -A $verz`" ] % Soll nur schaun ob irgend eine Datei im Verzeichniss ist und wenn die Befehle abarbeiten
sleep 10 % Das problem ist hier, dass ja immer Datein neu erstellt werden. Leider kenne ich den Befehl nicht um zu prüfen ob eine Datei schon vollständig entpackt wurde
then
var=$(ls $verz) %soll mir eigentlich einfach alle Fertigen Dateinnamen in ein array speichern

vLen=${#var[@]} %gibt länge des Arrays aus

for (( n=0; n<${vLen}; n++ )); %arbeitet alle Arrayeinträge nacheinander ab

do

programm ${var[$n]} ... -o \home\Ordner\${var[$n]} - %Startet das Programm welches die Datei verarbeitet und die ausgabe in ein anderes Verzeichniss speichert

mv \$verz\${var[$n]} \home\Ordner2\${var[$n]}; %Kopiert die orginale Datei in einen anderen ordner
done
fi


Das Zweite Script:
#!/bin/bash

verz=test
if ping -c 1 192.169.178.XX &> /dev/null %Prüft ob der Server online ist
sleep 10 %Wartet bis der Server bereit ist falls er durch Wake on Lan aufgewacht ist und noch hochfährt

then
find $verz -name "*.txt" -exec mv {} smb://XXXXX/YYYY/ \; %Verschiebt die Dateien aus dem test Verzeichniss auf den Server

done

fi


So hab ich mir das ungefähr gedacht. Aber da ich mich nicht so gut auskenne hab ich das sicher sehr sehr kompliziert geschrieben ;-)

LG
Bernhardt

Nachtrag: die Verschiebeaktionen sind eigentlich nur dazu gut dass ich bei den unmengen an Datein noch den überblick behalte. Das program selbst ändert einfach ein paar Zeichenketten in dem txt file. Und speichert das geänderte File an wieder.

Würde mich sehr freuen wenn ihr mir weiterhelfen könntet. :-)
 
Zuletzt bearbeitet:
Bernhardt schrieb:
Hi JD,
ein cron script läuft auch ohne, dass sich jemand eingelogt ist, bei Systemstart? Wenn das so ist hab ihr wirklich recht. Dann geht es nur noch um die eigentlichen Scripts... also..

Das erste welche das Programm aufruft und die Datein verschiebt:
Code:
#!/bin/bash

verz=test % Damit das ganze etwas flexibel bleibt wollte ich den Pfad einfach fest in eine Variable speichern

if [ ! "`ls -A $verz`" ] % Soll nur schaun ob irgend eine Datei im Verzeichniss ist und wenn die Befehle abarbeiten
sleep 10 % Das problem ist hier, dass ja immer Datein neu erstellt werden. Leider kenne ich den Befehl nicht        um zu prüfen ob eine Datei schon vollständig entpackt wurde
then
var=$(ls $verz) %soll mir eigentlich einfach alle Fertigen Dateinnamen in ein array speichern

vLen=${#var[@]} %gibt länge des Arrays aus

for (( n=0; n<${vLen}; n++ )); %arbeitet alle Arrayeinträge nacheinander ab

do

programm ${var[$n]} ... -o \home\Ordner\${var[$n]} - %Startet das Programm welches die Datei verarbeitet und die ausgabe in ein anderes Verzeichniss speichert

mv \$verz\${var[$n]} \home\Ordner2\${var[$n]}; %Kopiert die orginale Datei in einen anderen ordner
done
fi

Das Zweite Script:
Code:
#!/bin/bash

verz=test
if ping -c 1 192.169.178.XX &> /dev/null %Prüft ob der Server online ist
sleep 10 %Wartet bis der Server bereit ist falls er durch Wake on Lan aufgewacht ist und noch hochfährt

then
find $verz -name "*.txt" -exec mv {} smb://XXXXX/YYYY/ \; %Verschiebt die Dateien aus dem test Verzeichniss auf den Server

done

fi

So hab ich mir das ungefähr gedacht. Aber da ich mich nicht so gut auskenne hab ich das sicher sehr sehr kompliziert geschrieben ;-)

LG
Bernhardt

Nachtrag: die Verschiebeaktionen sind eigentlich nur dazu gut dass ich bei den unmengen an Datein noch den überblick behalte. Das program selbst ändert einfach ein paar Zeichenketten in dem txt file. Und speichert das geänderte File an wieder.

Würde mich sehr freuen wenn ihr mir weiterhelfen könntet. :-)

Mit dem Entpacken und modifizieren erschließt sich mir jetzt alles. Geschieht das entpacken automatisiert, oder machst du das händisch?

* Wenn wir mit dir fertig sind wirst du nicht einmal "watch" einsetzen :evillol:
* "sleep" und "watch (-n)" nehmen Sekunden als Übergabeparameter^^
* "/" für Pfade und "\" um Sonderzeichen zu einfachen Zeichen zu "degradieren" -> siehe Shebang(#!/bin/bash) vs find [...] \;
* for-Schleifen können Dateien einfacher in Variablen speichern =)
* die Scripts kannst du zusammenfassen. Solange das Entpacken und Loggen/Auswerten durch $programm läuft, ist dein kopierscript arbeitslos

* crons laufen ohne dass jemand angemeldet ist =)
* Backticks "``" sind böse!!! Die willst du die niemals nie angewöhnen :P. Immer mit "$()" arbeiten. Backticks kannst du nicht verschachteln im Gegensatz zu ... "$()"
* Prüfe ob der smb-Port an deinem NAS offen ist, statt zu pingen.
Hier zum ausprobieren:
Code:
until [ $( nc -z  localhost 23) ]; do echo 'port zu!'; sleep 1;done

Du kannst auf der Kommandozeile die laufenden Prozesse ausgeben lassen.
Sprich: Wenn kein tar-prozess (oder was auch immer du zum enpacken verwendest) gefunden wurde sollen alle Dateien in $verz eingelesen werden.

Edit: Kannst du den Titel noch von "[Batch] ..." in "[Bash] ..." umbenennen um die richtige Zielgruppe anzusprechen
 
Zuletzt bearbeitet:
Hi JD,
den Titel kann ich leider irgendwie nicht ändern, zumindest das [Batch] nicht. Oder gibt es dafür einen Trick?

Die Dateien werden automatisch entpackt. Leider kann ich das auch nicht ändern. Und das Problem ist einfach. Ich weis, dass der Entpackvorgang maximal 10 Minute dauert. (Danke für den Tip mit der Syntax) und daher das sleep. Oder gibt es einen Befehl der Prüfen kann ob die Datei vollständig ist? Leider kann ich nicht einfach schaun ob das zip Program gerade arbeitet, weil es im eigentlichen Program integriert ist und das ist auch bei Systemstart an. Und somit leider immer angezeigt wird.

Ja, das mit den Scipts zusammenfassen stimmt. Hatte ich erst auch so, nur es kann eben sein, dass neue Dateien entpackt sind aber der NAS offline ist und dann möchte ich dennoch, dass wenigstens das eine Script funktioniert. Erst hatte ich die Abfrage ob der NAS aktiv ist auch als if verschachtelt, aber im Falle –keine neuen Dateien aber NAS auf einmal online funktioniert das dann nicht mehr. Daher die beiden separaten Scripts
Ok, dann hast du mich überzeugt mit crone zu arbeiten. ;-)
Hab die eine Schleife jetzt auch mal vereinfacht… hoffe ich… ;-)
Mit dem offenen Port ist auch eine gute Idee. Aber wacht er davon auch auf? Kann das leider die Woche nicht testen, da ich unterwegs bin.
OK dann hier mein neuer Versuch *G*

#!/bin/bash

verz=test

if ((ls -A $verz) > 0)
then
sleep 600
for f in $(ls $verz);
do

programm $f... -o /home/Ordner/$f -

mv /$verz/$f /home/Ordner2/$f;
done
fi


Das Zweite Script:
#!/bin/bash

verz=test
until [ ! $( nc -z xxxxxx xx) ]
do

find $verz -name "*.txt" -exec mv {} smb://XXXXX/YYYY/ \;
done
fi

LG Bernhardt
 
Zuletzt bearbeitet:
Zurück
Oben