--
Sheriff Chameleotoptor sighed with an air of weary sadness, and then
turned to Doppelgutt and said 'The Senator must really have been on a
bender this time -- he left a party in Cleveland, Ohio, at 11:30 last
night, and they found his car this morning in the smokestack of a British
aircraft carrier in the Formosa Straits.'
-- Grand Panjandrum's Special Award, 1985 Bulwer-Lytton
bad fiction contest.
Vorab: nicht `ls *.jpg` sondern for f in *jpg; do
Den Stern expandiert in beiden Faellen die Shell, also brauchst dafuer Du
kein "ls" dazwischen.
> Wieso nimmt convert nicht den jeweiligen Dateinamen, den ihm *jpg
> liefert?
Hast Du Dir schon mal die Manualpage dazu angesehen? Dort steht
SYNOPSIS
convert input-file [options] output-file
Also erwartet convert genau ein Inputfile, mehrere Optionen und dann genau
ein Outputfile. Sonst stuende dort der Plural {input,output}-files.
> Ist da die bash oder convert für verantwortlich?
Weder noch. Die tun, was Du ihnen sagst, also bist Du dafuer
verantwortlich. Du kannst beispielsweise folgendes machen (falls Deine
Shell die Bash o.ae. ist):
for f in *jpg ; do
g=${f%.jpg}
convert -resize 100x100 $g-t.jpg
done
Hier kriegt die Variable g den Filenamen ohne die Endung ".jpg" und dann
kannst Du als output-file bei convert z.B. die Endung "-t.jpg" anhaengen.
Tip: schau' in der Manualpage der Shell nach, was ${f} und ${f%...} machen,
damit Du verstehen lernst.
--jc
--
In zweifelhaften Fällen entscheide man sich für das Richtige.
-- Karl Kraus (1874-1936)
--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/
Zum AUSTRAGEN schicken Sie eine Mail an debian-user-g...@lists.debian.org
mit dem Subject "unsubscribe". Probleme? Mail an listm...@lists.debian.org (engl)
* Juergen Christoffel <j...@unser.net>:
> for f in *jpg ; do
> g=${f%.jpg}
> convert -resize 100x100 $g-t.jpg
> done
Also da fehlt doch wiederum der Input-Dateiname. Und es geht auch
ohne den Umweg über $g:
$ for f in *.jpg; do convert -resize 100x100 $f ${f%.jpg}_thumb.jpg; done
Und wenn's wirklich viele Dateien sind die Ausgabe von find in ein
while-read-Konstrukt pipen.
Gruß
Christian
> > Ist da die bash oder convert für verantwortlich?
>
> Weder noch. Die tun, was Du ihnen sagst, also bist Du dafuer
> verantwortlich. Du kannst beispielsweise folgendes machen (falls Deine
> Shell die Bash o.ae. ist):
>
> for f in *jpg ; do
> g=${f%.jpg}
> convert -resize 100x100 $g-t.jpg
> done
>
> Hier kriegt die Variable g den Filenamen ohne die Endung ".jpg" und dann
> kannst Du als output-file bei convert z.B. die Endung "-t.jpg"
> anhaengen.
>
Aber das hab ich doch gemacht (nur unschöner). Mach dir mal einen
Testordner mit 5 jpgs, dann wirst du sehn, dass convert dir nur 4
thumbnails fabriziert und das muss irgendwas mit der Verarbeitung durch
die bash zu tun haben.
> Tip: schau' in der Manualpage der Shell nach, was ${f} und ${f%...}
> machen, damit Du verstehen lernst.
>
Hmm, sorry, ich frag vorsichtshalber noch mal nach: ${f} müsste gleich $f
sein und ${f%...} ist das " shortest matching pattern (the ``%'' case)",
das du benutzt, damit du -t (oder -thumb oder was auch immer) zwischen
Namen und Endung setzen kannst?
Besten Dank und Grüße,
Gebhard
--
In India, "cold weather" is merely a conventional phrase and has come into
use through the necessity of having some way to distinguish between weather
which will melt a brass door-knob and weather which will only make it
mushy.
-- Mark Twain
* Gebhard Dettmar <gebhard...@student.hu-berlin.de>:
> > On Mon, Feb 13, 2006 at 01:54:58PM +0100, Gebhard Dettmar wrote:
> > > for i in `ls *jpg`; do convert -resize 100x100 $i thumbs$i; done
[...]
> Aber das hab ich doch gemacht (nur unschöner). Mach dir mal einen
> Testordner mit 5 jpgs, dann wirst du sehn, dass convert dir nur 4
> thumbnails fabriziert und das muss irgendwas mit der Verarbeitung durch
> die bash zu tun haben.
Das Problem bei der ursprünglich von dir benutzten Syntax ist,
dass kein Outputfile angegeben wird, convert aber die Angabe eines
Outputfiles erwartet. Dabei kann man (wo ist das dokumentiert?)
mehrere Inputfiles angeben und ein Outputfile. Convert hängt dann
an den Outputfilenamen automagisch einen Zähler vor die
Dateiendung. Wenn die Shell also `ls *jpg` expandiert zu einer
Reihe von existierenden Dateinamen, dann wird der letzte Dateiname
als Basis für den Outputdateinamhmen hergenommen, die Datei wird
also nicht verarbeitet. Soweit zumindest meine Tests.
Gruß
Christian
Ja, stimmt, der Input fehlte. Das $g war aber nicht als Umweg gedacht,
sondern der Uebersichtlichkeit wegen dort.
> Und wenn's wirklich viele Dateien sind die Ausgabe von find in ein
> while-read-Konstrukt pipen.
Wenn's so viele Files sind, dass die Shell ueber "expansion too long"
klagt, dann bevorzuge ich ein "find ... | xargs ..." aber auch fuer die
Shell gilt das Perl-Motto "There's more than one way to do it"...
Vorteil der Kombination find/xargs ist, dass find eine Option -print0 hat
und xargs passend dazu eine Option -0 und man dann auch problemlos Files
mit Whitespace im Namen verarbeiten kann.
Ob man auch NUL in IFS stecken koennte, um dann mit read den Output von
-print0 zu bearbeiten? Aber das fuehrt uns jetzt vom ImageMagick-Problem
weit weg ;-)
--jc
--
In zweifelhaften Fällen entscheide man sich für das Richtige.
-- Karl Kraus (1874-1936)
Da unterscheiden sich Deine und meine Realitaet aber gewaltig. Ich
konvertiere sehr haeufig ein File nach dem andern in einer Schleife. Und
das, was da gemacht werden soll, habe ich einfach in ein Shellscript
gepackt, dass ich mit den Input-Images als Parameter aufrufe.
> Und da er mehrere input-files mit *jpg nimmt, wäre nur noch
> die Frage, wie die Outputfiles zu bestimmen sind (ohne for, pipes etc.).
Nein, es waere zu klaeren, was denn die Semantik bei multiplen Input-Files
ist. ImageMagick wird ziemlich komplex, wenn man mit multiplen Inputs
arbeitet und die Dokumentation ist da tatsaechlich nicht immer so
hilfreich.
Ich weiss nicht, welche Version Du verwendest. Ist aber auch nicht so
wichtig. Nur: in der aktuellen Version 6 ist die Verarbeitung der
Kommandozeile konsistent gemacht worden, was vorher nicht der Fall war.
Siehe unten.
> Was passiert, wenn man keine angibt, habe ich in der letzten Mail
> geschildert - jedenfalls nicht "Missing output-file name" o.s.ä. - die
> Manpage ist da also unvollständig.
Jein. Convert ist ein sehr komplexes Kommando, das u.a. auch Animationen
erzeugen kann. Und Filenamen mit einem Index in eckigen Klammern deuten IMO
darauf hin, das er aus irgend einem Grund "Subimages" fuer Animationen
erzeugt. Ich vermute mal (geraten) das das Zwischenfiles sind, die convert
erzeugt dann aber nicht weiter verarbeitet, weil kein entsprechender
Operator folgt.
Wenn Du "convert -help" aufrufst, wirst Du folgendes sehen:
Usage: convert [options ...] file [ [options ...] file ...] [options ...] file
...
was uns allerdings auch nicht so richtig weiter hilft ;-0 Die Files
koennten hier, je nach Option, horizontal oder vertikal hintereinander
geklebt werden oder in ein animiertes GIF gepackt werden. Was jetzt eine
Option macht, naemlich Dein -resize, wenn danach mehrere Images angegeben
werden, steht nicht in der Manpage.
Seit der Version 6 sieht ImageMagick Postfix-Operatoren vor, also
command image1 -operator1 image2 -operator2 ... out-image
und es arbeitet Prefix-Operatoren
command -operator image1 out-image
momentan noch als Legacy-Kommando ab.
Tip: bei Anthony Thyssen findest Du sehr gute Anleitungen, vor allem unter
"basics" Hinweise auf die Probleme der Abbarbeitung der Kommandozeile in
frueheren Versionen und der bereinigten Logik in Version 6:
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/basics/
Und hier findest Du die offiziellen Manpages zu ImageMagick6:
http://www.imagemagick.org/script/convert.php
http://www.imagemagick.org/script/command-line-processing.php
> Aber das hab ich doch gemacht (nur unschöner). Mach dir mal einen
> Testordner mit 5 jpgs, dann wirst du sehn, dass convert dir nur 4
> thumbnails fabriziert und das muss irgendwas mit der Verarbeitung durch
> die bash zu tun haben.
Ja, passiert bei mir auch. Nein, es ist convert, dass nur vier Thumbnails
produziert, das hat nichts mit der Bash zu tun.
Ich verstehe nicht, was Dich an der for-Schleife stoert. Es muss wirklich
nicht immer alles in einer Zeile stehen. Das ist oft ein Zeichen von Sturm
und Drang, selten aber von ordentlicher Software. ;-)
> Hmm, sorry, ich frag vorsichtshalber noch mal nach: ${f} müsste gleich $f
> sein und ${f%...} ist das " shortest matching pattern (the ``%'' case)",
> das du benutzt, damit du -t (oder -thumb oder was auch immer) zwischen
> Namen und Endung setzen kannst?
Ja, %, %%, #, und ## sind Operatoren innerhalb der geschweiften Klammern,
mit denen man Prefixe oder Suffixe von Strings entfernen kann. Und
Hilfsvariablen wie $g sind kein Umweg, sondern machen Scripts oft
uebersichtlicher.
Zu convert noch einen Tip:
convert -size 100x100 image1 -resize 100x100 +profile '*' ...
Das -size sagt dem JPG-Parser, dass er nicht mit voller Aufloesung beim
Lesen des Inputfiles arbeiten muss, das +profile loescht das EXIF-Profile
des Inputfiles (sofern vorhanden), das sonst ggf. mit im Thumbnail landet
und es unnoetig vergroessert.
On Tuesday 14 February 2006 21:16, Christian Schult wrote:
> Hallo Gebhard,
>
> * Gebhard Dettmar <gebhard...@student.hu-berlin.de>:
> > > On Mon, Feb 13, 2006 at 01:54:58PM +0100, Gebhard Dettmar wrote:
> > > > for i in `ls *jpg`; do convert -resize 100x100 $i thumbs$i; done
>[...]
>
> Das Problem bei der ursprünglich von dir benutzten Syntax ist,
> dass kein Outputfile angegeben wird, convert aber die Angabe eines
> Outputfiles erwartet. Dabei kann man (wo ist das dokumentiert?)
Du meinst jetzt convert -resize 100x100 *jpg? (bei meiner for-Version ist
ja $thumbs das outputfile
> mehrere Inputfiles angeben und ein Outputfile. Convert hängt dann
> an den Outputfilenamen automagisch einen Zähler vor die
> Dateiendung. Wenn die Shell also `ls *jpg` expandiert zu einer
Bei obigem eben _nach_ dem Dateinamen, also p1010070.jpg.0 usw. aufwärts
daher auch das rename. Deshalb hab ich das ohne for gemacht, weil mir hier
an den Dateinamen eh nichts lag. Grundsätzlich habt ihr natürlich recht,
der einzige Unterschied ist, dass ich erst in dem Moment zu for gegriffen
habe, in dem mir an den Dateinamen was lag
> Reihe von existierenden Dateinamen, dann wird der letzte Dateiname
> als Basis für den Outputdateinamhmen hergenommen, die Datei wird
> also nicht verarbeitet. Soweit zumindest meine Tests.
>
Nein, bei meiner ursprünglichen (nach Jürgens Hinweis
expansionsbereinigt), deiner und Jürgens Version passiert dasselbe - das
letzte wird nicht verarbeitet - und Jürgen bestätigt das in seiner Mail
von 22.33 Uhr
Darin unterscheidet sich das also nicht von fehlender Angabe des
Outputfiles.
Gruß Gebhard
--
Better hope the life-inspector doesn't come around while you have your
life in such a mess.