ImageMagick en múltiples archivos

9

He convertido un solo archivo de BMP a PNG con ImageMagick convertusando el siguiente comando

convert CD\ Front.bmp CD\ Front.png

Tengo muchos de esos archivos, por lo que probé:

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

pero este comando se cuelga para siempre.

¿Qué estoy haciendo mal?

usuario54619
fuente

Respuestas:

12

Lo más probable es que tenga un problema porque no cita los nombres de los archivos:

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

haga esto para que el espacio en los nombres de archivo no cause problemas.

Zelda
fuente
3
$ftambién debería ser citado
Mat
Tienes razón, gracias por señalar
Zelda
1
Citar las variables es correcto, pero si cita el glob entonces el shell buscará un literal */*.bmp.
evilsoup
Gracias a ti también. Debería probar mis soluciones antes de publicar ...
Zelda
1

Refactorizaría el código así. Este método me parece más claro y fácil de depurar:

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
fuente
1
Me tomé la libertad de cambiar JPEG a PNG mientras revisaba
Anthon
Ahh, gracias ¡Pero también funcionó para JPEG!
JakeGould
1
Sí, supongo que sí, pero no fue lo que pidió el OP ;-)
Anthon
No lo use find | while read, especialmente cuando un globo sea suficiente.
Kevin
Y el sed sería mejor ya que 's/\.bmp$/.png/', obviamente, eliminaría el .png del comando real
Kevin