[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ps/pdf files verbinden


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