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?

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.


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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.