Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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?

Geschrieben

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

Geschrieben

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

Geschrieben (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 von Child123
Geschrieben

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.

Geschrieben

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

Geschrieben
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.

Geschrieben (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 von lupo49
Geschrieben

@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)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...