• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Was stimmt hier nicht!

Kandi

Member
Hallo Leute,

habe folgendes Skript geschrieben (mit Hilfe von ImageMagick, Installation hat auch bestens geklappt) und es kommt immer die unten angefuehrte Fehlermeldung. Was mache ich falsch?!?

Code:
#!/usr/bin/perl -w
# Script to compress Images in a Directory
# Some parts of this file are from http://pronix.linuxdelta.de
# last update: 10.04.2007

print "Programmname: $0\n\n";

opendir(DH, ".") or die "Fehler bei opendir : $!\n";
while(defined($name=readdir(DH))){
   print $name , "\n" if $name=~m/.*\.txt/;
   /usr/local/bin/convert -quality 70 $name;
   #print $name, "\n";  
}
closedir DH;

Fehlermeldung:
Code:
Administration 524 $ ./compress_image 
Use of /c modifier is meaningless without /g at ./compress_image line 12.
Bareword found where operator expected at ./compress_image line 12, near "/bin/convert"
        (Missing operator before nvert?)
Unquoted string "nvert" may clash with future reserved word at ./compress_image line 12.
Number found where operator expected at ./compress_image line 12, near "quality 70"
        (Do you need to predeclare quality?)
Scalar found where operator expected at ./compress_image line 12, near "70 $name"
        (Missing operator before  $name?)
syntax error at ./compress_image line 12, near "/usr/local"
Execution of ./compress_image aborted due to compilation errors.
Administration 525 $
 
OP
Kandi

Kandi

Member
Als erstes Danke einmal notoxp fuer deine Hilfe:

ich habe das Skript jetzt wie folgt geandert:
Code:
#!/usr/bin/perl -w
# Script to compress Images in a Directory
# Some parts of this file are from http://pronix.linuxdelta.de
# last update: 10.04.2007

print "Programmname: $0\n\n";

opendir(DH, ".") or die "Fehler bei opendir : $!\n";
while(defined($name=readdir(DH))){
   print $name , "\n" if $name=~m/.*\.txt/;
   system "/usr/local/bin/convert - quality 70 $name";
   #/usr/local/bin/convert -quality 70 $name;
   #print $name, "\n";  
}
closedir DH;

Wenn ich jetzt aber das Skript ausfuehre, schreibt er mir zuerst den Programmname: ./convert_image
und danach nichts mehr. Er ladet und ladet!
Was ist jetzt falsch!
 

regexer

Advanced Hacker
Kandi schrieb:
Wenn ich jetzt aber das Skript ausfuehre, schreibt er mir zuerst den Programmname: ./convert_image
und danach nichts mehr. Er ladet und ladet!
Was ist jetzt falsch!
Zwischen dem Minus und dem wort "quality" darf sicher kein space kommen, oder?

Außerdem: Willst du wirklich alle Verzeichniseinträge mit Konvert bearbeiten? Das würde auch Unterverzeichnisse etc. einschließen. Ich kenne convert zu wenig um zu sagen, wie es sich bei solchen Dingen verhält...
 
OP
Kandi

Kandi

Member
danke nochmals fuer den Hinweis zum kleinen Fehler. Habe ich jetzt ausgebessert.
Beim Befehl convert stimmt jetzt irgend etwas nicht.

er bringt folgende Fehlermeldung:
Code:
Programmname: ./compress_image

convert: missing an image filename `.'.
convert: missing an image filename `..'.
convert: missing an image filename `compress_image'.
convert: missing an image filename `IMG_4065.JPG'.

Ja eigentlich moechte ich schon, dass er alle Bilder dieses Verzeichnisses und der darunter konvertiert. Aber vielleicht hast du einen Vorschlag wie man es anders programmieren kann.

lg,
Kandi
 

regexer

Advanced Hacker
Kandi schrieb:
Ja eigentlich moechte ich schon, dass er alle Bilder dieses Verzeichnisses und der darunter konvertiert. Aber vielleicht hast du einen Vorschlag wie man es anders programmieren kann.
Zuerst müsste man die Verzeichniseinträge . und .. ausschließen. Dann das readdir plus zugehöriger Schleife in eine sub packen und für jedes Unterverzeichnis die sub rekursiv aufrufen.

Wenn du es aber nicht zwingend in perl machen musst würde ich hierfür Linux-Bordmittel benutzen. In etwa so:
Code:
find . -name '*.jpg' -type f -exec /usr/local/bin/convert -quality 70 {} \;
Ich habe das Kommando jetzt nicht getestet. Bitte alles weiter in man find nachlesen.
 

regexer

Advanced Hacker
notoxp schrieb:
Zuerst müsste man die Verzeichniseinträge . und .. ausschließen. Dann das readdir plus zugehöriger Schleife in eine sub packen und für jedes Unterverzeichnis die sub rekursiv aufrufen.
Für eine reine perl-Lösung gibt es sicher schon im Web viele viele Beispielscripts. Einfach mal nach "perl", "rekursion" (oder recursion im Englischen) und "readdir" googlen...
 
Oben