[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ps/pdf files verbinden
[Thread Prev] | [Thread Next]
- Subject: Re: ps/pdf files verbinden
- From: "Raphael H. Becker" <Raphael.Becker@xxxxxx>
- Date: Fri, 13 Jan 2006 19:21:36 +0100
- To: uugrn@xxxxxxxxxxxxxxx
On Fri, Jan 13, 2006 at 04:36:21PM +0100, CK wrote: > ----8<--------8<--------8<--------8<--------8<---- > #!/bin/bash Nimm lieber #! /bin/sh :) > cd bilder > for bild in *.jpg; do > ziel=`echo $bild | sed "s/.jpg/.pdf/"` probier mal ziel="$(basename $bild .jpg).ps" Oder, ganz ohne subshell und ohne "argument list too long"-Fehlern kommst du aus, wenn Du es so versuchst: find bilder/ -type f -name "*.jpg" | sed -e 's,^\(\(.*\)\.jpg\)$,\1|\2.pdf,' | while IFS='|' read bild ziel junk; do echo "convert '$bild' '$ziel'" done | sh Ausgaben: $ find frames/ -type f -name "*.jpg" | head -n 4 frames/20041030234700.jpg frames/20041030235200.jpg frames/20041001234940.jpg frames/20041030235700.jpg $ find frames/ -type f -name "*.jpg" | sed -e 's,^\(\(.*\)\.jpg\)$,\1|\2.pdf,' | head -n 4 frames/20041030234700.jpg|frames/20041030234700.pdf frames/20041030235200.jpg|frames/20041030235200.pdf frames/20041001234940.jpg|frames/20041001234940.pdf frames/20041030235700.jpg|frames/20041030235700.pdf $... | while IFS='|' ... done convert 'frames/20041030234700.jpg' 'frames/20041030234700.pdf' convert 'frames/20041030235200.jpg' 'frames/20041030235200.pdf' convert 'frames/20041001234940.jpg' 'frames/20041001234940.pdf' convert 'frames/20041030235700.jpg' 'frames/20041030235700.pdf' ... und das ganze wird nach "sh" gepiped, welches die erzeugten convert-Befehle ausfuehrt. Vorteil: man muss nicht fuer jedes Element eine Subshell mit Pipe darin forken, sondern alle Prozesse laufen gleichzeitig, lediglich convert wird dann n mal aufgerufen. Fuer wenige Dateien, ist die for-Methode mit dem subshell ok, aber im Zweifel kann es ganz schoen belastend sein, wenn man mal einige tausend hat $ ls frames/ | wc -l 109121 Nur als Alternative. Die Sache mit der Listenuebergabe zwischen den Komponenten hat den Vorteil, dass man in das Pipe jederzeit noch weitere Befehle einschieben kann, die den durch das jeweilige pipe fliessenden Datenstrom manipuliert, wie hier zB das sed. Letztlich erzeuge ich hier nur Zwischenformate, mit denen die Stufen miteinander kommunizieren koennen. Man kann fuer Debuggingzwecke in jedes pipe ein "tee debug_1.out |" dazwischenklemmen, um den Datenstrom der jeweiligen pipe in einer Datei zu protokollieren, zB wenn der 2342. convert-Befehl einen Fehler hat, kann man in der Eingabedatei in der 2342. Zeile nachsehen, was den Fehler verursaacht hat. Ggf kann man mit einem Editor einen Teil einer Liste ausschneiden und an die folgende Befehlskette verfuettern. Warum ich «while» einem «for» vorziehe ist auch nicht zuletzt die Tatsache, dass in einer for-schleife nur eine Variable iteriert werden kann (zB $X), das Konstrukt "while IFS='|' read X Y Z A B C junk; do ... ; done" hingegen iteriert ueber jede Zeile aus stdin und setzt dabei alle Variablen mit read, in diesem Fall arbeitet das sinnvoll auf einer Eingabe, die mit "|"-Zeichen getrennt ist, denkbar waere auch csv ("," oder ";"), wie man es aus Tabellenkalkulationen oder Datenbanken exportieren kann. Wie immer gibt es mehrere Wege fuer ein Ziel. MfG -- Raphael Becker http://rabe.uugrn.org/ http://schnitzelmitkartoffelsalat.und.rahmspin.at/ .........|.........|.........|.........|.........|.........|.........|..