Lori: ImageMagick convert Syntax >

Hi.

Ich schreibe gerade ein Sh-Skript für Unix (spezieller Linux), das alle Bilder in allen Unterverzeichnissen des angegebenen Verzeichnisses verkleinern soll, wenn deren Breite 1024px übersteigt.

  
#!/bin/sh  
  
directory="/home/lori/webs/bilder_orig/*"  
  
#In $dir sind die Ordner aus bilder_orig  
#In $file sind die Bilder aus allen $dir  
  
for dir in $directory ;  
 do  
 #Existiert der Ordner "neu" in den Unterverzeichnissen schon?  
 if [ -d $dir'/neu' ]  
  then  
   #Wenn ja, dann Meldung ausgeben und nichts machen  
   echo Ordner $dir'/neu' existiert  
  else  
   #Wenn nicht, dann erstellen und Rechte setzen  
   mkdir $dir'/neu'  
   chmod 777 $dir'/neu'  
   dir2=$dir  
   dir=$dir'/*'  
    for file in $dir ;  
     do  
     #Jedes Bild, dessen Breite höher als 1024px ist, verkleinern  
     cd $dir2  
     filename=`basename $file`  
     #Wenn die zu bearbeitende Datei eine Datei ist, dann bearbeiten. Grund: Ordner "neu" wird nicht mitinbegriffen  
     if [ -f $file ]  
      then  
      #< und > scheinen bei dieser Version von imagemagick nicht zu funktionieren  
      convert -resize 1024> $filename 'neu/'$filename  
     fi  
     done  
 fi  
  
  
 done  

Das Skript gibt mir für jede Datei die Meldung

./makeimgsmall.sh: line 30: 1024: Ungültiger Dateideskriptor

aus.
Außerdem zerstört es die Originalbilder. Sicherungskopien hurra :D

Hat jemand vielleicht auch eine Idee wie ich das Skript schneller machen kann? Weil zwei for-Schleifen ineinander zu verschachteln ist nicht gerade vorteilhaft.

Wie lautet denn die richtige Syntax für convert, damit alle Bilder deren Breite größer als 1024px ist, zu verkleinern auf 1024px zu * ?

Version ImageMagick 6.2.3

Danke
Lori

  1. Hi,

    Ich schreibe gerade ein Sh-Skript für Unix (spezieller Linux),

    ich gebe zu, dass Shellscripts unter Linux nicht gerade mein Spezialgebiet sind ...

    convert -resize 1024> $filename 'neu/'$filename

    ... aber versuchst Du hier nicht, den Befehl

    foo@host:> convert -resize 1024

    auszuführen und dessen Ausgabe nach "$filename 'neu/'$filename" zu schreiben?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah.

      ... aber versuchst Du hier nicht, den Befehl

      foo@host:> convert -resize 1024

      auszuführen und dessen Ausgabe nach "$filename 'neu/'$filename" zu schreiben?

      Das convert-Kommando verlangt zwingend eine Eingabe- und eine Ausgabedatei. Bei mogrify könnte man wenigstens auf letzteres verzichten.

      Einen schönen Donnerstag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
  2. Hallo Lori.

    #< und > scheinen bei dieser Version von imagemagick nicht zu funktionieren
          convert -resize 1024> $filename 'neu/'$filename

    Warum verwendest du es eigentlich auch? Es genügt vollkommen, einfach nur „1024“ als Argument für den -resize-Schalter anzugeben. Bilder, die kleiner sind, werden ignoriert, Bilder die größer sind, werden unter Beibehaltung der Seitenverhältnisse verkleinert.

    Verwende ich 1024>, erhalte ich ein und die selbe Fehlermeldung. Die genaue Anwendung kann ich aber selbst aus der Spezifikation nicht herauslesen.

    Einen schönen Donnerstag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hi

      #< und > scheinen bei dieser Version von imagemagick nicht zu funktionieren
            convert -resize 1024> $filename 'neu/'$filename

      Warum verwendest du es eigentlich auch? Es genügt vollkommen, einfach nur „1024“ als Argument für den -resize-Schalter anzugeben. Bilder, die kleiner sind, werden ignoriert, Bilder die größer sind, werden unter Beibehaltung der Seitenverhältnisse verkleinert.

      Bei mir werden auch die kleineren vergrößert...

      Danke
      Lori

      1. Hallo Lori.

        Bei mir werden auch die kleineren vergrößert...

        Natürlich werden sie, mein Fehler. Entspräche das von mir geschilderte Verhalten dem tatsächlichen, wären „<“ und „>“ ziemlich nutzlos.

        Der entscheidende Satz steht aber in der von mir verlinkten Spezifikation:

        Enclose the geometry specification in quotation marks to prevent the < or > from being interpreted by your shell as a file redirection.

        Mache ich dies, funktioniert alles wie gewünscht.

        Einen schönen Donnerstag noch.

        Gruß, Ashura

        --
        sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
        „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
        [HTML Design Constraints: Logical Markup]
  3. Hallo Lori,

    Das Skript gibt mir für jede Datei die Meldung

    ./makeimgsmall.sh: line 30: 1024: Ungültiger Dateideskriptor

    Mal schauen. In Zeile 30 steht bei dir exakt folgende Zeile:
    convert -resize 1024> $filename 'neu/'$filename

    "Ungültiger Dateideskriptor" klingt mir danach, als ob die Shell ein > oder ein < entdeckt hat, und dementsprechend die Ausgabe eines Programms in eine Datei ausgeben möchte. Und siehe da, ein solches Zeichen ist sogar zu finden. ;-)
    Wenn ich folgenden Code auf meinem System ausführe, erhalte ich den gleichen Fehler:
    convert -resize 1024> "beispiel.png" "neu/beispiel.png"

    Führe ich hingegen den folgenden Code aus, wird dieser Fehler nicht mehr dargestellt - dafür beschwert sich ImageMagick nun, dass es "neu/beispiel.png" nicht finden kann, und _zerstört_ die Datei beispiel.png:
    convert -resize 1024> "beispiel.png" "neu/beispiel.png"

    Wenn ich mir nun die Hilfe des Tools "convert" anschaue(convert --help), sehe ich ganz am Anfang, dass die Reihenfolge der Parameter und Pfade wichtig ist.
    Folgender Code funktioniert nun also wie gewünscht:
    convert "beispiel.png" -resize 1024> "neu/beispiel.png"

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)