Aqui está uma solução somente de shell para os três casos que você tem em sua pergunta:
for f in *.png.png ; do mv -i "${f}" "${f%.png}" ; done
for f in *.jpeg.jpg ; do mv -i "${f}" "${f%.jpeg.jpg}.jpg" ; done
for f in *.JPEG ; do mv -i "${f}" "${f%.JPEG}.jpg" ; done
Digite no diretório onde os arquivos serão renomeados.
Se você gosta de generalizar esse tipo de solução na forma de um script de substituição de sufixo, você pode fazer:
#!/bin/sh
from=${1:?} to=${2:?}
for f in *${from} ; do mv -i "${f}" "${f%${from}}${to}" ; done
e chame esse script com dois parâmetros, o sufixo a ser substituído e o novo sufixo.