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.