Script sans prétention, fait par un amateur pour s'initier au bash !
Il fonctionne mais demanderait beaucoup de corrections de la part de pros.
A tester dans un dossier dans lequel on aura copié les originaux.

#!/bin/sh
# photon v0.53 2004-2006 GPL Guy Passail 
# script à déposer dant un répertoire accessible au "PATH" (ex: ~HOME/bin) et à invoquer dans le répertoire des images à modifier!
# nécessite l'installation des programmes "Imagemagick" et "igal" (uniquement pour publication internet) 
# awk est pré-requis
# pour simplement tester le script en toute sécurité, le programme crée un sous-dossier "ori".
# ligne suivante à commenter une fois les tests effectués 
[ -d ori ] && rm *.jpg ; cp ori/*.jpg . || mkdir ori ; cp ./*.jpg ori

### définition des variables modifiables à la demande ###

#format de date: 
dt1=`date +%Y%m%d` # aaaammjj
#dt1=`date +%y%m%d` # aammjj

# chaine de caractères à supprimer par défaut: pas actif!
#chaine1='tech00' # défaut de l'appareil photo

# taille de l'image par défaut:
taille1='500' # pour affichage internet

### signature texte # cf convert dans fonction sign
#sig="GP" # texte de la signature
sig="%[EXIF:DateTimeOriginal]" # affichage date EXIF
#sig="$dt1"
#sig=`date '+%A %d/%m/%Y'` # vendredi 24/09/2004
#sig="27/06/04"
fon="/usr/X11R6/lib/X11/fonts/TTF/Enviro.TTF" # choix de la fonte
fon="/usr/X11R6/lib/X11/fonts/TTF/luxisri.ttf" # choix de la fonte
cou="red" # couleur des caractères
poi=15 # taille de la signature texte
pos1="10,20" # 10,20 position de la signature texte

### signature logo # cf composite dans fonction sign
pos2="+10+25" # +10+10 position du logo
sima="/home/guy/logo1.png" # image/logo watermark

#options d'igal
iga="-n -w 7 -d html"
#iga="-n -w 7 -d html --bigy 500" # pour 3 tailles dont ori
#iga="-s -w 7 -d html" # unique page d'index= le plus basique

bar='-------------------------------------------------------------------'

#supprime * après jpg!
chmod -x *.jpg

#### définition des fonctions###
#### fonctions menu ###
function menu ()
{
#[ -e liste_des_images.txt ] && rm -f liste_des_images.txt
rep=`pwd` # répertoire 
bas=`basename $rep`
clear
echo
echo -n "    Voici le menu concernant les images JPEG du dossier \"$bas\":
	  
	* vérifier le format des images .............. (1)
	* renommer l'ensemble des images de ce dossier (2)
	* réduire la taille des images ............... (3)
	* signer ses images .......................... (4)
        * créer un dossier HTML ...................... (5)
	* renommer et retailler les images  .(2)+(3).. (6)
	* retailler et créer un dossier HTML (3)+(4).. (7)
	* quitter .................................... (8)

		        	      -> votre réponse: "
read reponse

until [ "$reponse" = 1 -o "$reponse" = 2 -o "$reponse" = 3 -o "$reponse" = 4 -o "$reponse" = 5 -o "$reponse" = 6 -o "$reponse" = 7 -o "$reponse" = 8 ]
#until [ "$reponse" = "{ 1,2,3,4,5,6,7,8 }*" ]
do
echo "Réponse invalide: \"$reponse\", tapez \"1 2 3 4 5 6 7 ou 8\" "
read reponse
done
#clear
case $reponse in
1)
ident ; menu ;;
2)
renom ; menu ;;
3)
conv ; menu ;;
4)
sign ; menu ;;
5)
html ; menu ;;
6)
renom ; conv ; menu ;;
7)
conv ; html ; menu ;;
8)
[ -d tmp ] && rm -rf tmp
### 5 lignes suivantes à commenter/supprimer dans version de production après les test ###
#cd ..
cd $rep
[ -d html ] && rm -rf html
[ -d $dos ] && rm -rf $dos
[ -d $nom ] && mv $nom test
cd test
clear ; exit 0 ;;
esac
}

#### fonction ident ###
function ident ()
{
clear
[ -e ident_images ] && rm ident_images
#touch liste_images
#echo "Utiliser \"Flèche / Bas\" pour voir la suite ou \"Q\" pour continuer le programme">> liste_images
#echo "Taper \"Q\" pour continuer" >> liste_des_images
#echo ${bar} >> liste_images
for f in *.jpg
do
identify $f >> ident_images
#echo ${bar} >> ident_images
done
clear
cat ident_images
#sleep 5
[ -e ident_images ] && rm ident_images
}

#### fonctions renom ###
function renom ()
{
[ -d tmp ] || mkdir tmp
cp *.jpg tmp # copie dans tmp avant validation
clear

# titre
echo
echo -n "   Quel titre ? Entrez un titre : "
read titre
[ -z "$titre" ] || titre=`echo "_$titre" | tr " " "_" | tr 'A-Z' 'a-z'` # suppression des espaces et majuscules
#nom=${dt}${titre}

# choix d'une chaine à effacer. à revoir avec awk
#echo
#echo -n "   Quelle chaîne de caractère faut-il effacer ? (par défaut : $chaine1 = \"Entrée\") : "
#read chaine2
#lis=`find ./*.jpg | grep "$chaine2" | head -1` # control de l'existence de la chaine
#until [ -z "$chaine2" -o -n "$lis" ]
#do
#echo "   Réponse invalide: \"$chaine2\", cette chaine n'existe pas "
#read chaine2
#done
#chaine=${chaine2:-$chaine1}

# date
echo
echo -n "  Extraire la date EXIF ? \"o\" ou \"n\" : "
read reponseZ
until [ "$reponseZ" = "n" -o "$reponseZ" = "o" ]
do
echo "   Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" "
read reponseZ
done
clear
case $reponseZ in

[oO]*) # date EXIF
""
dt=""
#for f in *.jpg ; do
identify -format %[EXIF:DateTimeOriginal] img_0024.jpg | tr " " "_" > liste
#identify -format %[EXIF:DateTimeOriginal] img_0024.jpg | mv img_0024.jpg "$0_$titre"
cat liste
sleep 10
#done

;;
[nN]*) # date manuelle ou par défaut
echo
echo -n "   Quelle date ? (\"yyyymmdd\" ; aujourd'hui: \"$dt1\" = Entrée) :  "
read dt2
until [ -z "$dt2" -o "${#dt2}" = 8 ]  # control du nb de caractères
#until [ -z "$dt2" -o "${#dt2}" = "[a-zA-Z]*"  # control numérique....a faire
do
echo "   Réponse invalide: \"$dt2\", vous devez entrer 8 chiffres : \"yyyymmdd\" "
read dt2
done
dt="${dt2:-$dt1}"
nom=${dt}${titre}

# renommage
ls | grep .jpg >> liste  # pour awk recalage du n° d'image
#awk '{ system("mv -v "sprintf("\"%s\" \"%s%s%s\"", $0, "toto", sprintf("%d", FNR), ".jpg")) }' liste # OK
#awk '{ system("mv -v "sprintf("\"%s\" \"%s%s%s\"", $0, prefixe, sprintf("%d", FNR), ".jpg")) }' prefixe="$nom" liste # en cours 
#awk '{ system("mv -v "sprintf("\"%s\" \"%s%s%s%s\"", $0, prefixe, "_", sprintf("%d", FNR), ".jpg")) }' prefixe="$nom" liste # OK OK

awk '{ system("mv -v "sprintf("\"%s\" \"%s%s%s%s%s\"", $0, dat, tit, "_", sprintf("%d", FNR), ".jpg")) }' dat="$dt" tit="$titre" liste 
;;
esac

# ancienne version de renommage
#for f in *.jpg ; do
#identify -format %[EXIF:DateTimeOriginal] | mv $f $0
#mv $f "${nom}_${f##$chaine}" # supprime chaine
#done

# vérif du renommage
clear
[ -e liste ] && rm liste
ls | grep .jpg >> liste
clear
cat liste
[ -e liste ] && rm liste
echo $bar
echo
echo -n "   Etes-vous satisfait du renommage ? \"o\" ou \"n\" : "
read reponseZ
until [ "$reponseZ" = "n" -o "$reponseZ" = "o" ]
do
echo "   Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" "
read reponseZ
done
clear
case $reponseZ in
[oO]*)

echo $bar
echo
echo -n "Remplacer le repertoire d'origine \"$bas\" par \"$nom\"? \"o\" ou \"n\" : "
read reponseZ
until [ "$reponseZ" = "n" -o "$reponseZ" = "o" ]
do
echo "   Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" "
read reponseZ
done
clear
case $reponseZ in
[oO]*)
cd ..
mv ${rep} $nom
cd $nom
;;
[nN]*)
;;
esac

;;
[nN]*)
rm *.jpg ; cp tmp/*.jpg . ; clear ; menu ;;
#*)
#echo "Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" " ;;
esac
}

#### fonctions conv ###
function conv ()
{
[ -d tmp ] || mkdir tmp
cp *.jpg tmp # copie dans tmp avant validation
clear
# taille
echo
echo -n "	Quelle largeur/hauteur maxi? (par défaut : \"$taille1\" = Entrée) : "
read taille2
taille=${taille2:-$taille1}
# dossier
dos1=mod_$taille
echo -n "	Dans quel sous-dossier? (par défaut : \"$dos1\") : "
read dos2
dos=${dos2:-$dos1}
[ -d $dos ] || mkdir $dos
#mkdir "$dos"
# conversion
for f in *.jpg ; do
#convert -geometry "x${taille}" $f "${dos}/$f" hauteur maxi seulement
convert -resize "${taille}x${taille}" $f "${dos}/$f"
done
# vérification de conversion
#[ -d "$dos" ] && cd "$dos" && ls -l && cd ..
clear
[ -d "$dos" ] && cd "$dos" && ident && cd .. 
echo $bar
echo
echo "Les images sont déposées dans le sous-dossier \"$dos\""
echo
echo $bar
echo
echo -n "Etes-vous satisfait de la conversion ? \"o\" ou \"n\" : "
read reponseZ
until [ "$reponseZ" = "n" -o "$reponseZ" = "o" ]
do
echo "Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" "
read reponseZ
done
clear
case $reponseZ in
[oO]*)
echo
echo -n "   Remplacer les images d'origine par les images réduites? \"o\" ou \"n\" : "
read reponseZ
until [ "$reponseZ" = "n" -o "$reponseZ" = "o" ]
do
echo "   Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" "
read reponseZ
done
clear
case $reponseZ in
[oO]*)
rm *.jpg ; mv $dos/*.* . ; rm -rf $dos
;;
[nN]*)
;;
esac

;;
[nN]*)
rm *.jpg ; cp tmp/*.jpg . ; [ -d "$dos" ] && rm -rf "$dos" ; menu ;;
esac
}

#### fonction sign ###
function sign ()
{
clear
#tex=$pos '$sig'
#lig="-font $fon -stroke black -fill white -pointsize $poi -draw "text $tex")" OK
for f in *.jpg
do
#convert -verbose -font $fon -stroke $cou -fill white -pointsize $poi -draw "text $pos1 '$sig'" $f $f # OK en cours
#convert -verbose -font $fon -stroke black -fill white -pointsize $poi -draw "text $pos1 '%[EXIF:DateTimeOriginal]'" $f $f # test
composite -geometry $pos2 $sima $f $f
#composite -geometry $pos2 $sima 20040927_maison_ulm_2.jpg test.jpg # OK image

#command="convert -verbose $lig $f $f"
#form="composite -geometry +10+10 $f ~/sig1.jpg $f.test"
#${form}
done
#sleep 5
}

#### fonction igal ###
function html ()
{
[ -d "$dos" ] && cd $dos
mkdir html ; cp ./*.jpg html
igal $iga # commande de igal
#echo "   Editez le fichier .caption avant de continuer"

# verif igal
#[ -d html ] && ls -l html/*.html
clear
rep=`pwd`
bas=`basename $rep`
echo
echo $bar
echo
echo les fichiers sont dans le dossier \"$bas/html\" 
echo
echo $bar
echo
echo -n "Remplacer les images du dossier \"$bas\" par le contenu de \"$bas/html\"? \"o\" ou \"n\" : "
read reponseZ
until [ "$reponseZ" = "n" -o "$reponseZ" = "o" ]
do
echo "   Réponse invalide: \"$reponseZ\", vous deviez répondre par \"o\" ou \"n\" "
read reponseZ
done
clear
case $reponseZ in
[oO]*)
#rm *.jpg ; mv html/* . ; rm -rf html
rm *.jpg ; mv html/* . ; mv html/.* . ; rm -rf html
#mkdir ../html ; mv $rep/* ../html ; cd .. 
;;
[nN]*)
;;
esac

}

### lancement du script ####

menu

### fin du lancement du script ####