ImageMagick sur plusieurs fichiers

9

J'ai converti un seul fichier de BMP en PNG avec ImageMagick en convertutilisant la commande ci-dessous

convert CD\ Front.bmp CD\ Front.png

J'ai beaucoup de tels fichiers, j'ai donc essayé:

for f in */*.bmp ; do convert $f ${f%bmp}png; done

mais cette commande se bloque pour toujours.

Qu'est-ce que je fais mal?

user54619
la source

Réponses:

12

Vous avez probablement un problème car vous ne citez pas les noms de fichiers:

for f in */*.bmp ; do convert "$f" "${f%bmp}png" ; done
#                             ^  ^ ^           ^

faites cela pour que l'espace dans les noms de fichiers ne pose pas de problème.

Zelda
la source
3
$fdevrait également être cité
Mat
Vous avez raison, merci de le signaler
Zelda
1
Citer les variables est correct, mais si vous citez le glob, le shell recherchera un littéral */*.bmp.
evilsoup
Merci aussi à vous. Je devrais essayer mes solutions avant de poster ...
Zelda
18

Vous pouvez utiliser mogrify:

mogrify -format png *.bmp

Source: site Web Imagemagick

Thaldath
la source
1

Je voudrais refactoriser le code comme ceci. Je trouve cette méthode plus claire et plus facile à déboguer:

find . -type f -name '*.bmp' |\
  while read BMP
  do
    DIR=$(dirname "$BMP")
    PNG="$(echo $BMP | sed 's/.bmp//g')"
    convert "${BMP}" "${PNG}".png
  done
JakeGould
la source
1
J'ai pris la liberté de changer JPEG en PNG lors de la révision
Anthon
Ahh, merci. Mais cela a également fonctionné pour les JPEG!
JakeGould
1
Oui, je suppose que oui, mais ce n'était pas ce que le PO demandait ;-)
Anthon
Ne l'utilisez pas find | while read, surtout quand un glob suffit.
Kevin
Et le sed serait mieux car 's/\.bmp$/.png/', alors évidemment supprimez le .png de la commande réelle
Kevin