Child123 Geschrieben 7. Oktober 2009 Geschrieben 7. Oktober 2009 Ich habe ein Problem Ich habe für unsere marketing abteilung ein shell skript geschrieben welches ermöglichgt das die abteilung eine Tiff datein in einen eingansordner legt und die datei zu ps konvertiert wird und in eine ausgangsdatei legt dazu wird die datei sofort gedruckt und eine zeichnungsbogen drüber gehaun das skript läuft super nur ich habe 2 dicke probleme ich lade den dateinamen in eine variable per LS befehl... ich nehme cut nur um den dateinamen herauszufinden also ls -l /home/xx/*.tiff und dann mit cut das ich den dateinmae ohen endung habe danach arbeite ich mit dieser variable.... gebe die datei per variable zum drucker etc SSOOOOO nur.... problem 1 wenn keine datei vorhanden ist... er also per ls befehl keine datei findet bricht das skript sofort ab gibt es ne möglichkeit den datei namen irgenwie anders einzulesen??? das andere problem ist fast das selbe... sind 2 datein da nimmt er auch keine datei in die variable also die frage ist: Wie schaffe ich es das er automatisch den dateinamen in eine variable schreibt Zitieren
flashpixx Geschrieben 7. Oktober 2009 Geschrieben 7. Oktober 2009 Es ist immer hilfreich orthographisch korrekt sein Post zu verfassen. Generell ist es hilfreich den Code auch zu posten gibt es ne möglichkeit den datei namen irgenwie anders einzulesen??? man basename man dirname also die frage ist: Wie schaffe ich es das er automatisch den dateinamen in eine variable schreibt Shell expansion Section 3.4.4 bzw 3.4.5 Zitieren
flashpixx Geschrieben 7. Oktober 2009 Geschrieben 7. Oktober 2009 Falls noch Probs sind, bitte direkt den Code mit posten Zitieren
Child123 Geschrieben 7. Oktober 2009 Autor Geschrieben 7. Oktober 2009 ja ich bin momentan nicht auf arbeit ich poste in dann morgen früh aber eine frage habe ich noch ich habe ja mit der ls funktion den dateinamen herausgefiltert und dann mit basename die dateiendung abgeschnitten kann ich denn mit man basename bzw man dirname was ändern? das problem ist einfach das die datein immer andere namen haben und er automatisch diesen schritt machen muss also der code ist aus dem kopf VAR=~ # ls -l /home/beispeil | tr -s " " | cut -d " " -f 9 Var2=$(basename Var) ich weiß es fehlt etwas davon aber so sinngemß wenn meine einzigste datei in beispiel test.tiff heißt ist der inhalt von VAR= /home/beispiel/test.tiff nach dem befehl mit basename habe ich in VAR2 nur noch test damit arbeite ich dann weiter zum konvertieren z.b. convert $VAR2.tiff $VAR2.ps dann erzeugt er mir eine Test.ps gut und schön das geht aber wie gesagt ist in /home/beispiel/ keine datei sagt er *.tiff nicht gefunden und bricht das skript ab... das soll er nicht... er soll dann 5 sekunden schlafen und dann nochmal suchen den quelltext dafür habe ich... kanns abern icht testen weil er nach dem ls abbricht Zitieren
lupo49 Geschrieben 7. Oktober 2009 Geschrieben 7. Oktober 2009 Flashpixx hat darum gebeten den Quellcode mit zu posten. Dann tue das bitte auch unter der Verwendung von den CODE-Tags. Aus deinen Beschreibungen kann man sich nur mühselig etwas zusammen reimen. Zitieren
Child123 Geschrieben 7. Oktober 2009 Autor Geschrieben 7. Oktober 2009 wie gesagt bin atm zuhause morgen früh post ich es Zitieren
Child123 Geschrieben 8. Oktober 2009 Autor Geschrieben 8. Oktober 2009 okay vergesst das oben alles.... ich habe das problem eingedämmt und stehe nun vor dem konkreten testvariable= ABCDE.TIF Wie schaffe ich es das er mir ABCDE in eine variable schreibt und alles nach dem . abschneidet? (Die Dateinamen sind unterschiedlich lang also abzählen geht nicht ) also es sollte auch auf testvariable= ABCDEFGH.PDF funktioneren viele dank Zitieren
Child123 Geschrieben 8. Oktober 2009 Autor Geschrieben 8. Oktober 2009 hmm hab mal nen wenig gefummelt.. es müsste doch mit testvar=ABCD.EFG (echo $testvar | cut -d "." -f1 geht) aber wieso kann ich den inhalt nicht inne variable schrieben? testvar2=$($testvar | cut -d "." -f1) funktioniert nicht... wieso auch immer Zitieren
bigvic Geschrieben 8. Oktober 2009 Geschrieben 8. Oktober 2009 also es sollte auch auf testvariable= ABCDEFGH.PDF funktioneren Und auch mit Ich.bin.ein.unix.und.kein.windows.pdf ? Zitieren
Child123 Geschrieben 8. Oktober 2009 Autor Geschrieben 8. Oktober 2009 nein.... es wird immer nur 1 punkt geben Zitieren
Child123 Geschrieben 8. Oktober 2009 Autor Geschrieben 8. Oktober 2009 oh man... habe mir die doku mal durchgelsen aber so richtig weiß ich grade nichts damit anzufangen ich erläutere mal kurz genau mein problem File=$(ls /home/praktidv/Eingang/*.tiff 2>/dev/null) Filename=$(basename $File .tif convert /home/praktidv/Eingang/$Filename.tiff /home/praktidv/Ausgang/$Filename.ps Also ich suche einen Dateinamen... wenn er nichts findet leite ich die fehlermeldung um und er suche weiter nach durchlaufem des skriptes wenn er was findet nimmt er sich den dateinamen und schneidet das .tiff ab das ich nur noch den dateiname habe. Das funktionert soweit auch alles aber genau da ist der hund begraben... kommt eine .TIFF rein findet er sie nicht... Also dachte ich mir ich teste mal File=$(ls /home/praktidv/Eingang/ Da habe ich aber dann das problem wenn 2 datein in dem ordner liegen habe ich ne Variable File die Datei1 Datei 2 heißt dafür brauche ich als 1. den befehl weil ich gerne vor dem " " Die Variable abschneiden möchte zum 2 funktioniert convert /home/praktidv/Eingang/$Filename.tiff /home/praktidv/Ausgang/$Filename.ps nicht da die dateiendungen immer anders sind $Filename.tiff $Filename.Tiff $Filename.TIFF also war meine idee an $Filename das .tiff dran zu lassen da es ja immer aktuell ist da er grade erst eingelesen hat... dann würde es so aussehen convert /home/praktidv/Eingang/$Filename /home/praktidv/Ausgang/$AndereVariable.ps Die $AndereVariable muss %filename nur ohne datei endung sein also brauche ich den sed befehl um zum 1 den blenk abzuschneiden und zum anderen um das .tiff abzuschneiden nur hab ich 1 riesen problem grade... ich peil die sed doku nicht wäre nett wenn mir wer das erklären kann... ich mache seit montag sachen mit shell und habe direkt dieses projhekt bekommen... mit meiner alten programmsprache wäre das np aber grade stehe ich aufm schlauch Zitieren
bigvic Geschrieben 8. Oktober 2009 Geschrieben 8. Oktober 2009 mach doch einfach mal ... ls -a | sed -e 's/\..*$//' .. in dem Verzeichnis mit den Dateien. Dann siehste, was das sed-command macht. Und dann kommst denke ich selber weiter. Zitieren
Child123 Geschrieben 8. Oktober 2009 Autor Geschrieben 8. Oktober 2009 ganz ehrlich.... du hast mir den tag gerettet vielen dank Zitieren
Child123 Geschrieben 15. Oktober 2009 Autor Geschrieben 15. Oktober 2009 ich habe ein neues Problem in einem eingangs ordner befindet sich eine xxx.lst Datei i=0 while reag EINGANG do let $i let i=$i+1 echo $Eingang done <"$Filename".st # ich filtere mir weiter oben im text den Dateinamen raus So das klappt auch wunderbar... jede Zeile wird mir mit dem inhalt der .lst angezeigt Als letztes wort in der Datei ist das wort QUIT also $EINGANG hat nach dem ausstieg aus der Schleife den Wert QUIT versuch 1 war echo $EINGANG -> hm okay ging nicht wieso ist mir nen rätzel... also habe ich in der while schleife AUSGANG=$EINGANG gesetzt um eine bleibende Variable zu erhalten... das ging seltsamerweise i=0 while read EINGANG do let $i let i=$i+1 echo $Eingang AUSGANG=$EINGANG done <"$Filename".st # ich filtere mir weiter oben im text den Dateinamen raus So nun fängt mein Problem an gebe ich echo $AUSGANG zeit er mir: QUIT an super hat funktioniert if [ "$AUSGANG" == "QUIT" ] then echo Geht else echt geht nicht fi jedesmal als ergebnis geht nicht.... ich habe dann den komischen fehler gefunden echo $AUSGANG AUSGANG=QUIT echo $AUSGANG if [ "$AUSGANG" == "QUIT" ] then echo Geht else echt geht nicht fi Ausgabe: QUIT QUIT Geht also die anzeige sagt mir in beiden fällen steht QUIT drin... aber mit dem 1 geht es einfach nicht die if abfrage... weiß wer wieso? steht irgend nen müll hinter dem 1 QUIT den man nicht sieht? Zitieren
bigvic Geschrieben 15. Oktober 2009 Geschrieben 15. Oktober 2009 steht irgend nen müll hinter dem 1 QUIT den man nicht sieht? Mach halt mal ein echo "xx $AUSGANG xx" - dann siehst, ob was drin steht. Zitieren
Child123 Geschrieben 15. Oktober 2009 Autor Geschrieben 15. Oktober 2009 die idee hat ich auch schon alles was nach $AUSGANG kommt ist einfach weg... nicht in einer anderen zeile sondern komplett weg ach... und wenn hinter $AUSGANG was steht ist auch $AUSGANG weg... also xx $AUSGANG xx bringt xx Zitieren
flashpixx Geschrieben 15. Oktober 2009 Geschrieben 15. Oktober 2009 Verstehe ich das richtig, dass Du von einer Datei alle Zeilen haben willst ohne die letzte bzw die, die nicht das Wort "QUIT" enthält? Also dann kannst Du auch folgendes machen: MYCONTENT=$(`grep -v QUIT $MYDATEI`)* Alternativ kannst du mit tail, wc und head arbeiten *ungetestetet Zitieren
Child123 Geschrieben 15. Oktober 2009 Autor Geschrieben 15. Oktober 2009 (bearbeitet) jein in der LST Datei stehen angaben die unser Plot Managment system braucht Er soll erst mit der weiterverarbeitung beginnen wenn 1. eine lst vorhanden ist und 2 in dieser LST das wort Quit steht also hatte ich geplant eine schleife laufen zu lassen die immer nach dem wort quit sucht und bei einem fund erst weiter arbeitet... nur lässt sich die Variable in der Quit steht nicht verarbeiten und ich verstehe nicht wieso bzw... ich will die ganze lst datei in variablen lesen... jeden eintrag... d.h. ich habe hinterher ca. 35 variabelen alle aus der .lst... nur lässt sich nicht 1 davon weiter verarbeiten Bearbeitet 15. Oktober 2009 von Child123 Zitieren
flashpixx Geschrieben 15. Oktober 2009 Geschrieben 15. Oktober 2009 Beschreibe das Problem einmal vollständig. Also erst einmal, wenn Du eine Datei zeilenweise verarbeitest und das Wort "QUIT" erreichst, was passiert? Wenn Du abbrichst, dann muss es ja ein Kriterium geben, dass Du wieder weiter machst. Wie viele "QUITs" kann eine Datei haben, 1, 20, n fach? Poste einmal eine solche Datei und erkläre Dein Vorhaben. Wie prüfst Du, ob eine Datei vorhanden ist, d.h. läuft das Script in einer Endlosschleife und mach ein ls? Das ist schlecht, denn Du würdest hier auch halbgeschriebene Dateien finden und versuchen zu verarbeiten, d.h. Dein Programm läuft in einen undefinierten Zustand. Um Veränderungen an einem Verzeichnis / Datei zu bekommen, benutzt man INotify (inotify - Wikipedia, the free encyclopedia), das im Kernel kompiliert sein muss. Man kann dann bei einem entsprechenden Event reagieren und die Verarbeitungen triggern. Eine Endlosschleife "frisst" Resourcen. Zitieren
Child123 Geschrieben 15. Oktober 2009 Autor Geschrieben 15. Oktober 2009 Okay also: Ich habe einen Eingangsordner in dem vom Marketing Datein abgelegt werden können ich suche über den ls befehl alle 10 sekunden nach einer neuen Datei... Sobald ich eine Datei gefunden habe Geht er in eine 2 Schleife und wartet bis die dazu gehörige LS Datei vorhanden ist. (Einfach aus dem Grund weil er sonst noch bei der übertragung der datei anfangen würde) liegt auch die LST datei vor soll er sich aus dieser informationen holen in der LST datei stehen so sachen wie: -Dateiformat - Wo soll gedruckt werden - Wie oft soll gedruckt werden - Was für ein Papier etc. Diese Werte soll er alle in eine Variable übernehmen und in der bash datei leite ich diese variable mit dem dazu gehörigen befehl an unser flot managment system weiter.... zusätzlich soll die datei vorher mit einem wasserzeichen bedruckt werden... diese informationen hole ich mir halt alle aus der lst welchen stempel ich nehmen muss etc. und er soll erst den auftrag abschicken wenn in dieser lst datei das wort quit drin vorkommt... das ist das zeichen das die übertragung abgeschlossen ist und er alle wichtigen variablen übergeben hat... ich hoffe nun war es verständlicher das hauptproblem ist halt.... wie bekomme ich einen datei inhalt... in eine variable mit der ich weiter arbeiten kann Zitieren
flashpixx Geschrieben 15. Oktober 2009 Geschrieben 15. Oktober 2009 Okay also: Ich habe einen Eingangsordner in dem vom Marketing Datein abgelegt werden können ich suche über den ls befehl alle 10 sekunden nach einer neuen Datei... und genau das hatte ich geschrieben, dass das keine sinnvolle Lösung ist. Benutze INotify, dann wird Dir das Event ausgelöst "Datei vollständig da" und Du kannst beginnen etwas zu tun. Sobald ich eine Datei gefunden habe Geht er in eine 2 Schleife und wartet bis die dazu gehörige LS Datei vorhanden ist. (Einfach aus dem Grund weil er sonst noch bei der übertragung der datei anfangen würde) liegt auch die LST datei vor soll er sich aus dieser informationen holen Das kannst Du so pauschal nicht sagen, denn Nur weil Dateien "nacheinander" kopiert werden, müssen sie physikalisch nicht gleich geschrieben werden, das kommt letztendlich auf viele Faktoren an. Du kannst nur bei einem Unmount sicher gehen, dass die Datei dann komplett vorhanden ist. => INotify in der LST datei stehen so sachen wie: -Dateiformat - Wo soll gedruckt werden - Wie oft soll gedruckt werden - Was für ein Papier etc. exakten Aufbau der Datei posten! und er soll erst den auftrag abschicken wenn in dieser lst datei das wort quit drin vorkommt... das ist das zeichen das die übertragung abgeschlossen ist und er alle wichtigen variablen übergeben hat... Du hast nicht verstanden was ich will: Wie oft kommt das "Quit" vor? Weil wenn Du nur auf die Existenz prüfen musst, reicht ein grep. Außerdem ist das für mich nicht verständlich. Wenn die Datei komplett vorliegt müsste nach meiner Meinung nicht auf "Quit" geprüft werden, denn da die Datei vollständig ist, kann ich diese direkt verarbeiten das hauptproblem ist halt.... wie bekomme ich einen datei inhalt... in eine variable mit der ich weiter arbeiten kann in dem Du den Inhalt liest! Nur dazu wäre eben der Aufbau der Datei wichtig. Zitieren
lupo49 Geschrieben 15. Oktober 2009 Geschrieben 15. Oktober 2009 (bearbeitet) Du schreibst einfach den Inhalt in die Variable? VAR=$(cat foo.lst | grep -v QUIT) Anmerkung ("Useless use of cat"!) Damit hast den gesamten Inhalt von foo.lst in der Variablen $VAR. Um den Ansatz von flashpixx mittels inotify zu verfolgen, hier ein Ansatz: #!/bin/sh while { inotifywait -e create /verzeichnis/mit/der/lst/datei; }; do echo "Datei wurde geaendert..." <hier Verarbeitungsschritte einfuegen> done Wobei es für den "-e"-Parameter noch mehrere Trigger gibt. Bspw. "open", "modify", ... Bearbeitet 15. Oktober 2009 von lupo49 Zitieren
flashpixx Geschrieben 15. Oktober 2009 Geschrieben 15. Oktober 2009 @lupo: Dast cat ist überflüssig, denn Grep kann als Argument auch direkt die Datei übergeben werden Und zu INotify muss man dann ggf den Kernel neubauen und die INotify-Tools installieren (Distributionsabhängig) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.