#1 Le 22/01/2025, à 20:22
- Frankkunst
Modif datation et renomage de photo
Bonjour à tous,
Voilà je me suis fait 3 petits scripts pour me faciliter le travail de classement et rangement des photos JPEG . Fait pour Nautilus
Donc les voici, juste pour les partager et en faire profiter les nouveaux sur Ubuntu
Ces trois scripts sont à mettre dans le répertoire, de Nautilus, ~/.local/share/nautilus/scripts/ et à rendre exécutable
Le premier pour modifier les données date EXIF :
#!/bin/bash
#
##----------------------------------------------------- # modifDate #----------------------------------------------------------------------------
##------------------------------------------------------# version 24/01/2025 #-------------------------------------------------------------------
##------------------------------------------# Correction datation EXIF de fichiers JPEG #--------------------------------------------------------
: >~/temp/datamod
readonly INITD=$PWD
readarray -t Select <<< "$NAUTILUS_SCRIPT_SELECTED_URIS" ## Enregistrement sélection
nf=${#Select[@]} ; ((nf--)) ## Comptage sélection
function abandon {
zenity --info --width=1000 --timeout=3 --text="\nAbandon de l'opération\n\nAucune modification n'a été apportée\n\nCette fenêtre ce fermera dans : 3\""; exit
}
function modif {
g=0 m=0 h=0 k=0
for lignBrut in ${Select[@]}
do
nouvLigne=${lignBrut#"$NAUTILUS_SCRIPT_CURRENT_URI"}
printf -v z '%s%b' "${INITD}" "${nouvLigne//%/\\x}" ## création variable "z" utilisable
testfil=$(file -b -i "$z" | cut -d"/" -f2 | cut -d";" -f1) ; ((g++))
som=$(( $g * 100 / $nf )) ## Calcul avancement %
if [[ "$testfil" == "jpeg" ]]
then
cam=$(exiv2 "$z" 2>/dev/null | grep "Camera model") ## Extraction modèle APN
selecam=$(echo $cam | cut -d":" -f2)
if [[ "$selecam" == " $apn" ]] && (exiv2 -qg Exif.Photo.DateTimeOriginal "$z") ## Contrôle Modèle APN et Date
then ((m++))
exiv2 $corrheure $corrjour $corrmois $corrannee ad "$z" 2>/dev/null
else
((h++))
fi
else
((k++))
fi
echo -e "#Veuillez patienter, modification datation en cours .....$som %" ## Transmission en chiffre
echo "$som" ## Transmission à la barre de progression
done
ret=([0]="$g" [1]="$m" [2]="$h" [3]="$k") ; printf '%s\n' "${ret[@]}" >>~/temp/datamod ## export des variables hors fonction pour passage tube
}
IFS='|' read -r heure jour mois annee < <(zenity --forms --title="Correction \"horodatage\"" --text="Veuillez entrer la correction à apporter :\
\n\nLes heures et minute sous la forme \"00:00:00\" avec le signe - devant sans espace si négatif\
\n\nLes jours sous la forme \"0\" avec un - devant si négatif\
\n\nLes mois sous la forme \"0\" avec - devant si négatif\n\nPuis de même les années\
\n\n" --separator="|" --add-entry="heure:minute:seconde" --add-entry="jour" --add-entry="mois" --add-entry="année")
if [[ $? == 1 ]] ; then abandon ; fi
if [[ -n "$heure" ]] ; then corrheure="-a $heure" ; else corrheure= ; fi
if [[ -n "$jour" ]] ; then corrjour="-D $jour" ; else corrjour= ; fi
if [[ -n "$mois" ]] ; then corrmois="-O $mois" ; else corrmois= ; fi
if [[ -n "$annee" ]] ; then corrannee="-Y $annee" ; else corrannee= ; fi
apn=$(zenity --entry --title="Nom de l'appareil photo" --text="Veuillez entrer le nom de l'appareil\
\ntel qu'il apparait dans les propriétés de la photo\nde l'APN ayant servi aux prises de vues")
if [[ $? == 1 ]] ; then abandon ; fi
modif | zenity --progress --width=900 --auto-close --no-cancel --percentage=0 --title="Avancement de l'horodatage"\
--text="Veuillez patienter, modification datation en cours ....."
readarray -t RESULTAT < ~/temp/datamod ## récupération des compteurs de modifications
rm ~/temp/datamod
zenity --info --width=900 --title="Résultat"\
--text="Sur ${RESULTAT[0]} fichiers sélectionnés\
\n\nLa datation de <span color=\"lightblue\">\"${RESULTAT[1]}\"</span> fichiers a été modifiée et peuvent être maitenant renommé .\
\n\n\t<span color=\"red\">\"${RESULTAT[2]}\"</span> fichiers ne sont pas issus de \"$apn\" ou ne possèdent pas de date ...\
\n\n\t\t\tn'ont donc pas été touchés\
\n\n\tet ${RESULTAT[3]} ne sont pas des fichiers JPEG ..."
exit
Le deuxième pour renommer une sélection de fichiers :
#!/bin/bash
#
#-----------------------------------------------------------Renommage de fichier "jpeg" sur la base des données EXIF----------------------
#-----------------------------------------------------------nom : RenomJPEG-Select - auteur : Frankkunst - version :1 - date 16/01/2025
#---------------------------------------------------------------------------*************-------------------------------------------------
#-------------------------------------------------------------------# Nettoyage #----------------------------------------------------------------------
: >~/temp/data
readonly INITD=$PWD
#------------------------------------------------------------# Déclaration + Fonction #----------------------------------------------------------------------
RESULTAT=()
#------------------------
function abandon {
zenity --info --width=600 --timeout=3 --text="\nAbandon de l'opération\n\nAucun fichier n'a été renommé\n\nCette fenêtre ce fermera dans : 3\""; exit
}
function rnm { ## fonction de rennommage
g=0 m=0 h=0 k=0 ## mise à zero des compteurs
for lignBrut in ${Args[@]}
do
nouvLigne=${lignBrut#"$NAUTILUS_SCRIPT_CURRENT_URI"}
printf -v z '%s%b' "${INITD}" "${nouvLigne//%/\\x}" ## création variable "z" utilisable
testfil=$(file -b -i "$z" | cut -d"/" -f2 | cut -d";" -f1) ; ((g++)) ## test fichier jpeg
sum=$(( $g * 100 / $nf )) ## Avancement %
echo "$sum" ## Transmission à la barre de progression
echo -e "#Veuillez patienter, renommage en cours ..... $sum %" ## Transmission en chiffre
if [[ "$testfil" == "jpeg" ]] ## contrôle jpeg
then
datefich= ## vidange de la variable
if (exiv2 -qg Exif.Photo.DateTimeOriginal "$z")
then
set $(exiv2 -qg Exif.Photo.DateTimeOriginal "$z") ## extraction données de datations
datefich="$4"
else
datefich=
fi
if [[ -n "$datefich" ]] && [[ "$datefich" != 0000:00:00 ]] ## contrôle présence de données
then ((m++))
f=$(printf "%03d" $m) ; e=${f: -3} ## mise en forme compteur sur trois chiffres
exiv2 -r"$ordre""$e" rename "$z" 2>/dev/null ## renommage
else printf "\"$z\" ..... n'a pas de données de date !\n" >>fichInvalide.txt ; ((h++))
fi
else printf "\"$z\" ..... n'est pas un fichier \"jpeg\" donc pas traité !\n" >>fichInvalide.txt ; ((k++))
fi
done
ret=([0]="$g" [1]="$m" [2]="$k" [3]="$h") ; printf '%s\n' "${ret[@]}" >>~/temp/data ## export des variables hors fonction
}
readarray -t Args <<< "$NAUTILUS_SCRIPT_SELECTED_URIS"
nf=${#Args[*]} ; ((nf--))
#-------------------------------------------------------------------# Entrée + Choix #-------------------------------------------------------------------------------
rep=$(zenity --forms --width=800 --title=" RenomJPEG-Select - Frankli " \
--text="\n Ce script utilise les données <span color=\"green\">\"exif\"</span> pour renommer les fichers .\nIl va rechercher la date originale de la prise de vue pour composer le nom de fichier .\n\nVous pouvez aussi entrer à l'invite une <span color=\"green\">\"étiquette\"</span> sous la forme d'un mot (Ceci est optionnel) .\nCe dernier sera repporté à la fin du nom de fichier\n\nPuis appuyer sur <span color=\"green\">"Valider"</span> pour continuer" \
--add-entry="Étiquette :")
#---------------------------------------------------
if [[ $? == 1 ]] ; then abandon ; fi
#---------------------------------------------------
format=$(zenity --list --height=300 --title="Choix format date" --text="Veuillez choisir entre ces formats :" --column="format de date"\
"AAMM"\
"AAAAMM"\
"AAMMJJ"\
"AAAAMMJJ"\
"JJMMAAAA"\
"AAMMJJ-hhmmss"\
"JJMMAA"\
"JJMMAA-hhmmss"\
"AAAAMMJJ-hhmmss"\
"JJMMAAAA-hhmmss"\
"MMJJ-hhmm")
#---------------------------------------------------
if [[ $? == 1 ]] ; then abandon ; fi
##--------------------------------------------------------------------## Préparation Nom de renommage ##--------------------------------------------------------
if [[ -z $format ]] ; then format="AAAAMMJJ-hhmmss" ; fi
case $format in
AAMM) formDate="%y%m" ;;
AAAAMM) formDate="%Y%m" ;;
AAMMJJ) formDate="%y%m%d" ;;
AAAAMMJJ) formDate="%Y%m%d" ;;
JJMMAAAA) formDate="%d%m%Y" ;;
AAMMJJ-hhmmss) formDate="%y%m%d-%H%M%S" ;;
JJMMAA) formDate="%d%m%y" ;;
JJMMAA-hhmmss) formDate="%d%m%y-%H%M%S" ;;
AAAAMMJJ-hhmmss) formDate="%Y%m%d-%H%M%S" ;;
JJMMAAAA-hhmmss) formDate="%d%m%Y-%H%M%S" ;;
MMJJ-hhmm) formDate="%m%d-%H%M";;
*) formDate="%Y%m%d-%H%M%S" ;;
esac
supp="$rep"
if [[ ${#rep} -ne 0 ]]
then
ordre=$(echo -e ""$formDate"_"$supp"-") ## préparation base de renommage avec ou sans complément
else
ordre=$(echo -e ""$formDate"-")
fi
##--------------------------------------------------------------------# lancement tache #-------------------------------------------------------------------------
infoavantravail () {
cat <<eof
Vous avez sélectionné $nf fichiers pour les renommer .
Il vont être renommé sous le format :
"$format"_"$supp"-000
Désirez-vous continuer ?
Si oui, appuyez sur "Valider"
eof
}
zenity --text-info --width=1000 --height=300 --title="Accord avant renommage" --filename <(infoavantravail)
#zenity --question --text="Vous avez sélectionné <span color=\"red\">$nf</span> fichiers pour les renommer .\nIl vont être renommé sous le format :\n\n\
# "$format"_"$supp"-000\n\n\
# \nDésirez-vous continuer ?"
#----------------------------------------------------
if [[ $? == 1 ]] ; then abandon ; fi
#----------------------------------------------------
rnm | zenity --progress --width=900 --auto-close --no-cancel --title="Avancement du renommage" --text="veuillez patienter, renommage en cours ..... " --percentage=0
##------------------------------------------------------------------# Affichage résultat #------------------------------------------------------------------------
for y in $(cat ~/temp/data)
do
RESULTAT+=($y)
done
rm ~/temp/data
zenity --info --width=900 --title="Résultat des courses" \
--text="${RESULTAT[0]} fichiers du dossier :\n\n<span color=\"green\">\"$PWD\"</span>\n\n\t\tOnt été éxaminé \!\n\nDont ${RESULTAT[1]} rennomé\n\nEt ${RESULTAT[3]} ne possèdent pas de date\n\n<span color=\"red\"> ${RESULTAT[2]} fichier\\s n'ont pas été traité </span>"
FICHIER=fichInvalide.txt
if [[ -f "$FICHIER" ]] ; then zenity --text-info --width=1400 --height=300 --title="Fichier non renommé" --filename=fichInvalide.txt ; fi
rm fichInvalide.txt 2>/dev/null
exit
Et le troisième pour renommer tout le répertoire courant :
#!/bin/bash
#
#-----------------------------------------------------------Renommage de fichier "jpeg" sur la base des données EXIF----------------------
#-----------------------------------------------------------Nom : RenomJPEG-All - auteur : Frankkunst - version :1 - date 16/01/2025
#---------------------------------------------------------------------------*************-------------------------------------------------
#-------------------------------------------------------------------# Nettoyage #----------------------------------------------------------------------
printf >~/temp/data
#------------------------------------------------------------# Déclaration + Fonction #----------------------------------------------------------------------
RESULTAT=()
#------------------------
function abandon {
zenity --info --width=600 --timeout=3 --text="\nAbandon de l'opération\n\nAucun fichier n'a été renommé\n\nCette fenêtre ce fermera dans : 3\""; exit
}
function rnm { ## fonction de rennommage
g=0 m=0 h=0 k=0 ## mise à zero des compteurs
for z in $(ls $PWD)
do
testfil=$(file -b -i "$z" | cut -d"/" -f2 | cut -d";" -f1) ; ((g++)) ## test fichier jpeg
if [[ $testfil == "jpeg" ]] ## contrôle jpeg
then
datefich= ## vidange de la variable
if (exiv2 -qg Exif.Photo.DateTimeOriginal "$z")
then
set $(exiv2 -qg Exif.Photo.DateTimeOriginal "$z") ## extraction données de datations
datefich="$4"
else
datefich=
fi
if [[ -n $datefich ]] && [[ $datefich != 0000:00:00 ]] ## contrôle présence de données
then ((m++))
f=$(printf "%03d" $m) ; e=${f: -3} ## mise en forme compteur sur trois chiffres
exiv2 -r$ordre$e rename "$z" 2>/dev/null ## renommage
sum=$(( $g * 100 / $nf ))
echo "$sum"
echo -e "#Veuillez patienter, renommage en cours ..... $sum %"
else printf "\"$z\" n'a pas de données de date !\n" >>fichInvalide.txt ; ((h++))
fi
else printf "\"$z\" n'est pas un fichier \"jpeg\" donc pas traité !\n" >>fichInvalide.txt ; ((k++))
fi
done
ret=([0]="$g" [1]="$m" [2]="$k" [3]="$h") ; printf '%s\n' "${ret[@]}" >>~/temp/data ## export des variables hors fonction
}
while read ; do Args[$n]=$REPLY ; ((n++)) ; done < <(ls $pwd)
nf=${#Args[*]}
#-------------------------------------------------------------------# Entrée + Choix #-------------------------------------------------------------------------------
rep=$(zenity --forms --width=800 --title=" RenomJPEG-All - Frankli " \
--text="\n Ce script utilise les données <span color=\"green\">\"exif\"</span> pour renommer les fichers .\nIl va rechercher la date originale de la prise de vue pour composer le nom de fichier .\n\nVous pouvez aussi entrer à l'invite une <span color=\"green\">\"étiquette\"</span> sous la forme d'un mot (Ceci est optionnel) .\nCe dernier sera repporté à la fin du nom de fichier\n\nPuis appuyer sur <span color=\"green\">"Valider"</span> pour continuer" \
--add-entry="Étiquette :")
#---------------------------------------------------
if [[ $? == 1 ]] ; then abandon ; fi
#---------------------------------------------------
format=$(zenity --list --height=300 --title="Choix format date" --text="Veuillez choisir entre ces formats :" --column="format de date"\
"AAMM"\
"AAAAMM"\
"AAMMJJ"\
"AAAAMMJJ"\
"JJMMAAAA"\
"AAMMJJ-hhmmss"\
"JJMMAA"\
"JJMMAA-hhmmss"\
"AAAAMMJJ-hhmmss"\
"JJMMAAAA-hhmmss"\
"MMJJ-hhmm")
#---------------------------------------------------
if [[ $? == 1 ]] ; then abandon ; fi
##--------------------------------------------------------------------## Préparation Nom de renommage ##--------------------------------------------------------
if [[ -z $format ]] ; then format="AAAAMMJJ-hhmmss" ; fi
case $format in
AAMM) formDate="%y%m" ;;
AAAAMM) formDate="%Y%m" ;;
AAMMJJ) formDate="%y%m%d" ;;
AAAAMMJJ) formDate="%Y%m%d" ;;
JJMMAAAA) formDate="%d%m%Y" ;;
AAMMJJ-hhmmss) formDate="%y%m%d-%H%M%S" ;;
JJMMAA) formDate="%d%m%y" ;;
JJMMAA-hhmmss) formDate="%d%m%y-%H%M%S" ;;
AAAAMMJJ-hhmmss) formDate="%Y%m%d-%H%M%S" ;;
JJMMAAAA-hhmmss) formDate="%d%m%Y-%H%M%S" ;;
MMJJ-hhmm) formDate="%m%d-%H%M";;
*) formDate="%Y%m%d-%H%M%S" ;;
esac
supp="$rep"
if [[ ${#rep} -ne 0 ]]
then
ordre=`echo -e ""$formDate"_"$supp"-"` ## préparation base de renommage avec ou sans complément
else
ordre=`echo -e ""$formDate"-"`
fi
##--------------------------------------------------------------------# lancement tache #-------------------------------------------------------------------------
zenity --question --text="Vous avez sélectinné <span color=\"red\">$nf</span> fichiers pour les renommer .\nIl vont être renommé sous le format :\n\n\
<span color=\"green\"> "$format"_"$rep"-000 </span> \n\n\
\nDésirez-vous continuer ?"
#----------------------------------------------------
if [[ $? == 1 ]] ; then abandon ; fi
#----------------------------------------------------
file_list=* ; for z in $file_list
do
mv -n "$z" "${z// /_}" 2>/dev/null
done | zenity --progress --width=900 --auto-close --no-cancel --title="Suppression des espaces" --text="Veuillez patienter ..." --pulsate
rnm | zenity --progress --width=900 --auto-close --no-cancel --title="Avancement du renommage" --text="Veuillez patienter, renommage en cours ..... " --percentage=0
##------------------------------------------------------------------# Affichage résultat #------------------------------------------------------------------------
for y in $(cat ~/temp/data)
do
RESULTAT+=($y)
done
zenity --info --width=900 --title="Résultat des courses" \
--text="${RESULTAT[0]} fichiers du dossier :\n\n<span color=\"green\">\"$PWD\"</span>\n\n\t\tOnt été éxaminé \!\n\nDont ${RESULTAT[1]} rennomé\n\nEt ${RESULTAT[3]} ne possèdent pas de date\n\n<span color=\"red\"> ${RESULTAT[2]} fichier\\s n'ont pas été traité </span>"
FICHIER=fichInvalide.txt
if [[ -f "$FICHIER" ]] ; then zenity --text-info --width=1400 --height=300 --title="Fichier non renommé" --filename=fichInvalide.txt ; fi
rm fichInvalide.txt 2>/dev/null
exit
Alors amusez vous bien .;)
Dernière modification par Frankkunst (Hier à 12:30)
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#2 Le 22/01/2025, à 23:13
- Watael
Re : Modif datation et renomage de photo
function modif {
local -i g h k m
for lignBrut in "${Select[@]}"
parce que je suis complaisant.
mais en fait
modif() {
#pas besoin d'initaliser les variables
#soit
echo "$NAUTILUS_SCRIPT_SELECTED_URIS" | while read lignBrute
#soit
for file in "$@"
testfil=$(file -b -i "$z" | cut -d"/" -f2 | cut -d";" -f1)
testFile=$(file --brief --mime-type "$z")
if test "$testFile" = 'image/jpeg'
ou
if test "${testFile#*/}" = 'jpeg'
ET
toujours pas for x in $(ls)
pourquoi ?
parce que :
faire profiter les nouveaux
qui ne devraient pas apprendre d'âneries.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 22/01/2025, à 23:13
- Frankkunst
Re : Modif datation et renomage de photo
Si vous avez des suggestions, je suis toujours preneur
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#4 Le 22/01/2025, à 23:24
- Watael
Re : Modif datation et renomage de photo
ret=([0]="$g" [1]="$m" [2]="$h" [3]="$k") ; printf '%s\n' "${ret[@]}" >>~/temp/datamod
pourquoi ?
les variables d'une fonction (à moins d'avoir été déclarées (par declare ou local)) ont une portée globale : ret, puisqu'il n'a pas été déclaré, est disponible pour "zenity Résultat".
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#5 Le 22/01/2025, à 23:45
- iznobe
Re : Modif datation et renomage de photo
reinventer la roue quelle joie .
il existe des dizaines de logiciels pour faire ce genre de chose dont celui-ci : https://forum.ubuntu-fr.org/viewtopic.p … #p22817406
Dernière modification par iznobe (Le 22/01/2025, à 23:47)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#6 Le 23/01/2025, à 10:51
- Frankkunst
Re : Modif datation et renomage de photo
pourquoi ?
les variables d'une fonction (à moins d'avoir été déclarées (par declare ou local)) ont une portée globale : ret, puisqu'il n'a pas été déclaré, est disponible pour "zenity Résultat".
Pour modifDate
J'ai commencé le script par la fonction principal et l'ai étoffé petit à petit, l'ensemble fonctionnait bien jusqu'au moment où ...
j'ai voulu mettre une barre de progression Zenity ...et là , sûrement dû au "|" , les variables ne passaient plus ! de là utilisation de "ret" et du fichier temporaire ~/temp/datamod
De surcroît j'ai eu pas mal de souci quand j'ai introduit "--percentage" de Zenity avec la transmission du poucentage "som" , là va comprendre pourquoi si je le fait avant la boucle "if [[ "$testfil" == "jpeg" ]]" les variable ne ressortent plus même par le fichier, la seule position possible c'est après la boucle !?...
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#7 Le 23/01/2025, à 10:55
- Frankkunst
Re : Modif datation et renomage de photo
ET
toujours pas for x in $(ls)
pourquoi ?
parce que :faire profiter les nouveaux
qui ne devraient pas apprendre d'âneries.
Je ne suis pas un pro, j'ai tout appris en autodidacte, je ne prétends pas tout savoir, j’essaie juste de partager ce que j'arrive à faire !
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#8 Le 23/01/2025, à 12:57
- Frankkunst
Re : Modif datation et renomage de photo
reinventer la roue quelle joie .
il existe des dizaines de logiciels pour faire ce genre de chose
Je ne pense pas !
Avant j'utilisais "Pyrenamer" mais c'est terminé ! Alors pour moi et pour ma fille qui ne s'y entend pas avec la ligne de commande, car tout le monde n'est pas informaticien
Donc voilà n'ayant pas trouvé ce qui correspondait à mon attente, avec mon peu de connaissance, je me suis lancé ...
Et je suis assez content du résultat
Essais le et tu me diras ce que tu en penses !
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#9 Le 23/01/2025, à 13:14
- Watael
Re : Modif datation et renomage de photo
j'ai oublié de dire que, autant que possible, on ne modifie pas l'IFS durablement dans un script :
IFS='|' read -r heure jour mois annee < (zenity --forms --title="Correction \"horodatage\"" ...)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#10 Le 24/01/2025, à 17:49
- Frankkunst
Re : Modif datation et renomage de photo
autant que possible, on ne modifie pas l'IFS durablement dans un script :
J'ai essayé avec ce type de commande :
IFS='|' read -r heure jour mois annee < (zenity --forms --title="Correction \"horodatage\"" ...)
Même avec < $(....
Mais sans succès !...?
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne
#11 Le 24/01/2025, à 18:18
- Watael
Re : Modif datation et renomage de photo
oops ! j'ai oublié un < :
IFS='|' read -r heure jour mois annee < <(zenity --forms --title="Correction \"horodatage\"" ...)
il s'agit d'une Substitution de processus.
Dernière modification par Watael (Le 24/01/2025, à 18:19)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#12 Le 24/01/2025, à 19:08
- Frankkunst
Re : Modif datation et renomage de photo
Merci bien, tout est ok
C'est en forgeant que l'on devient forgerons ...
et
...petit à petit l'oiseau fait son nid !
Hors ligne