Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Frage zu convert aus imagemagick und Dateinamen

28 views
Skip to first unread message

Gebhard Dettmar

unread,
Feb 13, 2006, 8:00:10 AM2/13/06
to
Liebe Liste,
ich muss in letzter Zeit ständig thumbnails aus zugemailten Fotos
erzeugen. Meist haben die die kryptischen Dateinamen, wie sie
üblicherweise aus den Kameras kommen: p1010013.jpg usw. Daraus macht mir
convert ein und denselben Dateinamen mit ans Ende gehängter aufsteigender
Numerierung, also p1010013.jpg.0 .... p1010013.jpg.7, wobei das letzte
immer fehlt und ich es händisch nachmachen muss (s.u.). Die Ziffer am Ende
brauche ich dann für eindeutige Dateinamen, also kommt noch sowas wie
rename 's/p[0-9]*\.jpg\.([0-7])/thumbs$1\.jpg/' *.jpg.[0-7]
Bis jetzt war mir das immer egal, jetzt habe ich aber auf einmal Fotos mit
"richtigen" Dateinamen. Da hätte ich schon gern die Namen in den thumbs.
Muss ich da jetzt mit for ran, a la
for i in `ls *jpg`; do convert -resize 100x100 $i thumbs$i; done
Wieso nimmt convert nicht den jeweiligen Dateinamen, den ihm *jpg liefert?
Wieso fehlt bei p[0-9]* immer eins (das letzte, dessen Namen er aber nimmt
---schnipp---
-rw-r--r-- 1 gebhard gebhard 50968 Feb 3 21:22 p1010013_1.jpg
...usw., es sind 7, das letzte ist
-rw-r--r-- 1 gebhard gebhard 123769 Feb 3 21:22 p1010070.jpg
jetzt convert -resize 100x100 *jpg
-rw-r--r-- 1 gebhard gebhard 8065 Feb 13 13:43 p1010070.jpg.0
...usw., es sind 6, das letzte ist
-rw-r--r-- 1 gebhard gebhard 7885 Feb 13 13:43 p1010070.jpg.5
d.h., p1010070.jpg fehlt.
Ist da die bash oder convert für verantwortlich?
Dank im voraus
Gebhard

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

Juergen Christoffel

unread,
Feb 13, 2006, 11:32:27 AM2/13/06
to
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

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)

Christian Schult

unread,
Feb 13, 2006, 3:40:10 PM2/13/06
to
Hallo Juergen,

* 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

Gebhard Dettmar

unread,
Feb 14, 2006, 4:40:14 AM2/14/06
to
On Monday 13 February 2006 15:12, Juergen Christoffel wrote:
> 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
>
> Vorab: nicht `ls *.jpg` sondern for f in *jpg; do
>
oops, klar
[...]

>
> > 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.
>
Natürlich habe ich mir die angeguckt - und eben nur diesen "Singular-Fall"
gesehen, der in der Realität wohl nie auftritt - jedenfalls nicht bei
thumbnails. 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.).
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.

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

Christian Schult

unread,
Feb 14, 2006, 6:10:14 PM2/14/06
to
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

[...]


> 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

Juergen Christoffel

unread,
Feb 14, 2006, 6:50:09 PM2/14/06
to
On Mon, Feb 13, 2006 at 09:31:09PM +0100, Christian Schult wrote:
> Also da fehlt doch wiederum der Input-Dateiname. Und es geht auch
> ohne den Umweg über $g:

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)

Juergen Christoffel

unread,
Feb 14, 2006, 7:10:07 PM2/14/06
to
On Tue, Feb 14, 2006 at 10:39:49AM +0100, Gebhard Dettmar wrote:
> Natürlich habe ich mir die angeguckt - und eben nur diesen "Singular-Fall"
> gesehen, der in der Realität wohl nie auftritt - jedenfalls nicht bei
> thumbnails.

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.

Gebhard Dettmar

unread,
Feb 18, 2006, 4:20:07 AM2/18/06
to
Hallo Christian,

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.

0 new messages