Tu mejor apuesta sería usar ImageMagick.
No soy un experto en el uso real, ¡pero sé que puedes hacer prácticamente cualquier cosa relacionada con las imágenes con esto!
Un ejemplo es:
convert image.png image.jpg
que mantendrá el original y creará la imagen convertida.
En cuanto a la conversión por lotes, creo que necesita usar la herramienta Mogrify que es parte de ImageMagick.
Tenga en cuenta que esto sobrescribe las imágenes antiguas.
El comando es:
mogrify -format jpg *.png
Tengo un par de soluciones más.
La solución más simple es como la mayoría ya publicada. Un simple bash for loop.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Por alguna razón, tiendo a evitar los bucles en bash, así que aquí hay un enfoque de xargs más unixy, usando bash para la manipulación de nombres.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
El que uso. Utiliza GNU Parallel para ejecutar múltiples trabajos a la vez, lo que le brinda un impulso de rendimiento. Está instalado de forma predeterminada en muchos sistemas y casi definitivamente está en su repositorio (es un buen programa para tener a mano).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
El número de trabajos predeterminado es el número de núcleos de CPU que tiene. Encontré un mejor uso de la CPU usando 3 trabajos en mi sistema dual-core.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Y si quieres algunas estadísticas (hora estimada de llegada, trabajos completados, tiempo medio por trabajo...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
También existe una sintaxis alternativa si está utilizando GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
Y una sintaxis similar para algunas otras versiones (incluida Debian).
parallel convert '{}' '{.}.jpg' -- *.png
El convert
El comando que se encuentra en muchas distribuciones de Linux se instala como parte de la suite ImageMagick. Aquí está el código bash para ejecutar convert
en todos los archivos PNG en un directorio y evitar ese problema de doble extensión:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done