Hallo Leute, ich möchte in einem Verzeichniss ps in pdf wandeln. Leider sind meine shell Kenntnisse etwas dürftig. Mein Ansatz ist #!/bin/bash GO=1; while [ $GO=0 ] do for each in *.ps; do ps2pdf $each $each.pdf; done; for each in *.ps; do rm $each; done; sleep 5; done exit es tut zwar, ist aber nich schön. Kann mir jemand das Script verbessern. Danke Olli
Oliver Wiemer wrote:
es tut zwar, ist aber nich schön.
Das Skript, oder die erzeugten Dateien?
Kann mir jemand das Script verbessern.
--- #!/bin/bash for each in *.ps; do ps2pdf $each $each.pdf && rm $each done --- Wobei dir natuerlich Dateien mit lustigen Namen Probleme bereiten koennen. Peter
Hallo Oliver, Oliver Wiemer schrieb:
ich möchte in einem Verzeichniss ps in pdf wandeln. Leider sind meine shell Kenntnisse etwas dürftig. Mein Ansatz ist
#!/bin/bash GO=1; while [ $GO=0 ] do for each in *.ps; do ps2pdf $each $each.pdf; done; for each in *.ps; do rm $each; done; sleep 5; done exit es tut zwar, ist aber nich schön. Kann mir jemand das Script verbessern.
Du könntest es auch so machen: while true; do ... done Gruß christian --
* Oliver Wiemer schrieb am 20.Mär.2003:
Hallo Leute,
ich möchte in einem Verzeichniss ps in pdf wandeln. Leider sind meine shell Kenntnisse etwas dürftig. Mein Ansatz ist
#!/bin/bash GO=1; while [ $GO=0 ]
while true wäre einfacher.
do for each in *.ps; do ps2pdf $each $each.pdf;
Besser Du faßt $each und auch $each.pdf in ".." ein, dann hast Du keine Probleme bei Leerzeichen im Dateinamen. Bist Du Dir sicher, daß die fertige Datei datei.ps.pdf heißen soll, und nicht etwa nur datei.pdf, wenn doch, dann empfehle ich basename. ps2pdf $each `basename $each .ps`.pdf Wichtig hierbei, daß es zwichen dem abschließenden ` und dem . kein Leerzeichen oder so gibt. Du könntest hier auch den . vor ps und pdf weglassen. Eigentlich auch das p. ;)
done; for each in *.ps; do rm $each;
Hier löschst Du auch dann, wenn die erste Schleife nicht funktioniert hat und es keine pdf Datei gibt. Besser Du machst es in einem Zug. ps2pdf $each `basename $each .ps`.pdf && rm $each Dann wird nur gelöscht, falls bei ps2pdf nichts schief gelaufen ist. Vorrausgesetzt, ps2pdf gibt einen exitcode ungleich 0 aus, falls die pdf-Datei nicht erstellt wurde, oder nicht so wie sie sein sollte.
done; sleep 5;
Warum sleep? Sehe da nicht den Sinn. Halt, doch, jetzt habe ich verstanden, Du willst ständig auf neu aufschlagende Dateien reagieren. Hmm. Irgendwie merkwürdig. Du hast keine Abbruchbedingungen.
done exit
exit ist Überflüssig, wenn zu Ende, dann zu Ende.
es tut zwar, ist aber nich schön. Kann mir jemand das Script verbessern.
Ich kenne ps2pdf nicht, weiß nicht genau, wie es sich verhält. #!/bin/bash while true do for each in *.ps do ps2pdf $each `basename $each .ps`.pdf && rm $each || exit 1 done sleep 5 done Ich habe noch eine Abbruchbedingung eingebaut, fall was schief läuft, es sollte aber auch noch ein trap eingebaut werden um z.B ein CTRL-C abzufangen und aufzuräumen und dann erst abbrechen. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
On Don, 20 Mär 2003 at 11:57 (+0100), Bernd Brodesser wrote: [...]
#!/bin/bash
while true do for each in *.ps do ps2pdf $each `basename $each .ps`.pdf && rm $each || exit 1 done sleep 5 done
Ich habe noch eine Abbruchbedingung eingebaut, fall was schief läuft, es sollte aber auch noch ein trap eingebaut werden um z.B ein CTRL-C abzufangen und aufzuräumen und dann erst abbrechen.
Den exit 1 halte ich für unglücklich. Es soll ja eine Endlos-Schleife sein und da sollte das Fehlschlagen _eines_ ps2pdf nicht gleich zum Abbruch des ganzen Scripts führen. Da ist IMHO noch ein wenig Error-Handling nötig (z. B. ein df, um prüfen zu können, ob das Dateisystem voll ist; dann sollte nämlich tatsächlich abgebrochen werden). Ich habe einen anderen Vorschlag, der das Teil (wenn es ein unbeaufsichtigter Langläufer werden soll) IMHO etwas robuster macht: Du kannst nie 100% sicher sein, dass Dein Script nicht aus irgendeinem Grund abschmiert. Dann musst Du es in Deiner Version immer neu starten. Warum nicht cron dafür nutzen? Dann brauchst Du auch die while-Schleife nicht. Richte einen crontab-Job ein, der das Script jede Minute startet, dann macht auch ein Abbruch eines Prozesses nix aus. Variante 1: Es können gern mehrere Prozesse parallel laufen (erhöht auch gleich den Durchsatz - allerdings auch die Systemauslastung) <schnipp> #! /bin/bash # FS mehr als 90% gefuellt: Abbruch `df /mein/dateisystem | tail -1 | \ sed 's/^.*[^0-9]\([0-9]*\)%.*$/\1/'` -ge 90 && exit 1 # Verarbeitungsschleife for f in *.ps; do test -f "$f" && ps2pdf "$f" "`basename \"$f\" .ps`.pdf" && rm "$f" done <schnapp> Die zusätzliche Abfrage *test -f "$f"* deshalb, weil ein evtl. parallel laufender Prozess die Datei zwischenzeitlich verarbeitet haben könnte. Variante 2: Es kann nur einen geben. <schnipp> #! /bin/bash # FS mehr als 90% gefuellt: Abbruch test `df /mein/dateisystem | tail -1 | \ sed 's/^.*[^0-9]\([0-9]*\)%.*$/\1/'` -ge 90 && exit 1 # Abbruch-Handling lock=/var/run/my_prog trap "rm $lock; exit 1" 1 2 3 15 # Lockfile existiert und sperrender Prozess lebt noch test -f $lock && ps -p `cat $lock` >/dev/null && exit 0 # Lockfile anlegen echo $$ >$lock # Verarbeitungsschleife for f in *.ps; do ps2pdf "$f" "`basename \"$f\" .ps`.pdf" && rm "$f" done rm $lock <schnapp> Alles so gut wie ungetestet. Jan
Geniale Idee. Ich werde das mit cron machen. Danke für die Hife. By Olli Am Don, 2003-03-20 um 21.26 schrieb Jan Trippler:
On Don, 20 Mär 2003 at 11:57 (+0100), Bernd Brodesser wrote: [...]
#!/bin/bash
while true do for each in *.ps do ps2pdf $each `basename $each .ps`.pdf && rm $each || exit 1 done sleep 5 done
Ich habe noch eine Abbruchbedingung eingebaut, fall was schief läuft, es sollte aber auch noch ein trap eingebaut werden um z.B ein CTRL-C abzufangen und aufzuräumen und dann erst abbrechen.
Den exit 1 halte ich für unglücklich. Es soll ja eine Endlos-Schleife sein und da sollte das Fehlschlagen _eines_ ps2pdf nicht gleich zum Abbruch des ganzen Scripts führen. Da ist IMHO noch ein wenig Error-Handling nötig (z. B. ein df, um prüfen zu können, ob das Dateisystem voll ist; dann sollte nämlich tatsächlich abgebrochen werden).
Ich habe einen anderen Vorschlag, der das Teil (wenn es ein unbeaufsichtigter Langläufer werden soll) IMHO etwas robuster macht: Du kannst nie 100% sicher sein, dass Dein Script nicht aus irgendeinem Grund abschmiert. Dann musst Du es in Deiner Version immer neu starten. Warum nicht cron dafür nutzen? Dann brauchst Du auch die while-Schleife nicht. Richte einen crontab-Job ein, der das Script jede Minute startet, dann macht auch ein Abbruch eines Prozesses nix aus.
Variante 1: Es können gern mehrere Prozesse parallel laufen (erhöht auch gleich den Durchsatz - allerdings auch die Systemauslastung)
<schnipp> #! /bin/bash
# FS mehr als 90% gefuellt: Abbruch `df /mein/dateisystem | tail -1 | \ sed 's/^.*[^0-9]\([0-9]*\)%.*$/\1/'` -ge 90 && exit 1
# Verarbeitungsschleife for f in *.ps; do test -f "$f" && ps2pdf "$f" "`basename \"$f\" .ps`.pdf" && rm "$f" done <schnapp>
Die zusätzliche Abfrage *test -f "$f"* deshalb, weil ein evtl. parallel laufender Prozess die Datei zwischenzeitlich verarbeitet haben könnte.
Variante 2: Es kann nur einen geben.
<schnipp> #! /bin/bash
# FS mehr als 90% gefuellt: Abbruch test `df /mein/dateisystem | tail -1 | \ sed 's/^.*[^0-9]\([0-9]*\)%.*$/\1/'` -ge 90 && exit 1
# Abbruch-Handling lock=/var/run/my_prog trap "rm $lock; exit 1" 1 2 3 15
# Lockfile existiert und sperrender Prozess lebt noch test -f $lock && ps -p `cat $lock` >/dev/null && exit 0
# Lockfile anlegen echo $$ >$lock
# Verarbeitungsschleife for f in *.ps; do ps2pdf "$f" "`basename \"$f\" .ps`.pdf" && rm "$f" done
rm $lock <schnapp>
Alles so gut wie ungetestet.
Jan
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Don, 2003-03-20 um 10.05 schrieb Oliver Wiemer:
Hallo Leute,
Hallo Oliver,
ich möchte in einem Verzeichniss ps in pdf wandeln. Leider sind meine shell Kenntnisse etwas dürftig. Mein Ansatz ist
#!/bin/bash GO=1; while [ $GO=0 ]
falsche Schreibweise, wenn $GO die Abbruchbedingung sein soll: while [ $GO = 1 ]
do for each in *.ps; do ps2pdf $each $each.pdf; done; for each in *.ps; do rm $each; done; sleep 5;
Hier muss jetzt noch irgendwo die Abbruchvariable gesetzt werden: GO=0
done exit
exit sollte nicht für sich stehen, sondern als exit 0. Damit wird der Rückgabewert gesetzt, den eine aufrufende Funktion prüfen kann. (0 = keine Fehler, >0 = Fehler) HTH, Wolfgang
participants (6)
-
B.Brodesser@t-online.de
-
Christian Schult
-
Jan.Trippler@t-online.de
-
Oliver Wiemer
-
Peter Wiersig
-
Wolfgang Hinsch