#1 Le 16/05/2009, à 16:01
- RedMorgan
script bash - renommer et déplacer photos dans des dossiers datés
!!! Attention le script est en béta ne travaillez pas sur les fichiers originaux !!!
bonjour à tous
voici un script bash qui permet de renommer les photos (du dossier ou se trouve le script) avec leur date de prise de vue, extraite des données exif (ex :2008-08-14_12.13.42.jpg) et de les déplacer vers un sous-dossier à la date de prise de vue (ex : 2008-08-14)
En cas de doublon le script renomme l'image déjà présente sous la forme 2008-08-14_12.13.42_001.jpg et incrémente les suivantes.
pour le moment le script se contente de copier et non déplacer les photos !!!
- Nécessite le paquet imagemagick : http://doc.ubuntu-fr.org/imagemagick
- Nécessite le paquet zenity
# Ce script est inspiré par le script exif_photos_rename_v1.1.sh de Taltan - http://www.taltan.fr
merci à coolgeek sur #ubuntu-fr pour son aide
!!! Attention le script est en béta ne travaillez pas sur les fichiers originaux !!!
#!/bin/bash
############################################################################################
# RedCiNe - http://leblogaperdredutemps.blogspot.com #
############################################################################################
# Script move_and_rename_files_in_folder_dated_v1b.sh #
# Licence : GNU / GPL #
############################################################################################
# Renomme et déplace les photos selon les données EXIF sous la forme : #
# ${aa}-${mm}-${jj}_${hh}.${min}.${sec}_${numero}.ext => ex : 2009-05-13_10.15.23_001.jpg #
# Les photos sont classées dans des dossiers en fonction de leur date de prise de vue #
# ex : 2009-05-13 #
############################################################################################
# Dépendances #
############################################################################################
# - Nécessite le paquet imagemagick : http://doc.ubuntu-fr.org/imagemagick #
# - Nécessite le paquet zenity #
# => sudo apt-get install imagemagick zenity #
############################################################################################
# 16/05/2009 - v.1b - Création #
############################################################################################
# Ce script est inspiré par : #
# le script exif_photos_rename_v1.1.sh de Taltan - http://www.taltan.fr - #
############################################################################################
# merci à coolgeek sur #ubuntu-fr pour son aide #
############################################################################################
## Variables
nb_param="$#" # nb de paramètres passés au script
erreur=0 # initialisation du compteur d'erreurs à 0
## dossier sélectionné par l'utilisateur
## vérifier la présence de sous-dossiers
## boucle tant que sous-dossiers
## se placer dans le sous-dossier
## vérifier la présence de photos
## boucle tant que photos
## Fonctions renommage et déplacement des fichiers
rename_move_jpeg ()
{
for filephoto in * # pour chaque fichier du répertoire courant
do # faire
extension=`echo $filephoto | awk -F "." '{print $NF}'` # création de la variable extension du fichier (ex : .jpg)
if [[ $extension == "jpg" || $extension == "JPG" || $extension == "jpeg" || $extension == "JPEG" ]] # test de l'extension
then
old_name="$filephoto" # on définie le nom du fichier actuel
date_time=`identify -format "%[EXIF:DateTime]" "$filephoto"` # création de la variable date / heure de la photo (ex: 2009:05:16 10:21:30 )
aa=`echo $date_time | cut -d: -f1` # création de la variable année (ex : 2009)
mm=`echo $date_time | cut -d: -f2` # création de la variable mois (ex : 05)
jj=`echo $date_time | cut -d: -f3 | cut -c1-2` # création de la variable jour (ex : 16)
hh=`echo $date_time | cut -d: -f3 | cut -c4-5` # création de la variable heure (ex : 10)
min=`echo $date_time | cut -d: -f4` # création de la variable minute (ex: 21)
sec=`echo $date_time | cut -d: -f5` # création de la variable seconde (ex: 30)
new_name=`echo ${aa}-${mm}-${jj}_${hh}.${min}.${sec}` # on définie le nouveau nom => 2009-05-16_10.21.30
folder_name=`echo ${aa}-${mm}-${jj}` # on définie le nom du dossier dans lequel la photo doit être transférée
if [[ -d $folder_name ]] # test si le dossier existe
then
echo "le dossier "$folder_name" existe"
else
mkdir $folder_name
echo "création du dossier : "$folder_name # création du dossier
fi ## test si le dossier existe
ls $folder_name| grep -i ${new_name} > /dev/null 2>&1
if [ $? -eq 0 ] # test si un fichier portant le même nom existe : cas des photos prisent en rafale ou prisent avec des appareils différents mais ayant même date heure minute seconde
then echo "un fichier portant ce nom existe"
## test de la valeur de n des fichiers existant
numsort=2
for filephoto2 in `find $folder_name -type f | grep $new_name` # pour chaque fichier du répertoire de destination
do ## trouver la valeur maximale de numsort du/des fichiers portant le même nom
if let ${filephoto2:31:3} 2>/dev/null # test si le fichier est déjà numéroté
then
if # test de la valeur de numsort
(( ${filephoto2:31:3}>$numsort )) # tester la valeur de numsort
var=${filephoto2:31:3}
echo "var : "$var
then
(( numsort=var+1 )) # si elle est supérieur à numsort mettre numsort à jour
echo "numsort est égal à : "$numsort
echo "filephoto2:31:3 est égal à : "${filephoto2:31:3}
fi # test de la valeur de numsort
fi # test si le fichier est déjà numéroté
done ## trouver la valeur maximale de numsort
# création de la variable numérotation
if [ $numsort -gt 0 ] && [ $numsort -lt 10 ]
then numsort=00$numsort # pour les paramètres 1 à 9 rajouter 2 digit => 001, 002, 003,..., 009
fi
if [ $numsort -gt 9 ] && [ $numsort -lt 100 ]
then numsort=0$numsort # pour les paramètres 10 à 99 rajouter 1 digit => 010, 011, 012,..., 099
fi
if [ $numsort -gt 100 ]
then numsort=$numsort # pour les paramètres supérieur à 100 ne pas rajouter de digit => 100, 101, 102,...
fi
echo "numsort : "$numsort
if [[ $numsort == 002 ]] # test la valeur de la variable numsort
then
mv $folder_name"/"${new_name}.${extension} $folder_name"/"${new_name}_"001".${extension}
echo "le fichier existant "$folder_name"/"${new_name}.${extension}" a été renommé en "$folder_name"/"${new_name}_"001".${extension}
cp $old_name $folder_name"/"${new_name}_${numsort}.${extension}
echo " et le fichier courant "$old_name" a été renommé en "${new_name}_${numsort}.${extension}" et déplacé vers "$folder_name
else
cp $old_name $folder_name"/"${new_name}_${numsort}.${extension}
echo "le fichier courant "$old_name" a été renommé en " ${new_name}_${numsort}.${extension}" et déplacé vers "$folder_name
fi # test de la valeur de la variable n
else
cp $old_name $folder_name"/"$new_name.${extension}
echo "le fichier "$old_name " est renomé en " $new_name.${extension}" et déplacé vers "$folder_name
(( n=0 )) ## s'il n'existe pas renomer le fichier en cours de traitement puis réinitialisation de la variable n=0
fi # test si un fichier portant le même nom existe cas des photo prise en rafale ou prise avec des appareils différents mais ayant même date heure minute seconde
echo "#################################################"
fi ## test de l'extension
done
echo "-----------------------------------------"
echo "Fin de traitement "
echo "-----------------------------------------"
echo "OK, vous pouvez fermer !"
}
rename_move_jpeg "$@" | zenity --text-info --title "exif_photos_rename" --width=500 --height=900
## fin boucle photos
## supprimer dossier
## fin boucle sous-dossier
Dernière modification par RedMorgan (Le 16/05/2009, à 16:05)
Hors ligne
#2 Le 16/05/2009, à 17:32
- Bushman02
Re : script bash - renommer et déplacer photos dans des dossiers datés
Essai concluant sur des photos prises le même jour : j'obtiens un sous-dossier portant la date de la prise de vue et contenant les photos renommées.
Avec des photos prises sur trois jours, j'obtiens trois sous-dossiers avec trois dates différentes et tous les fichiers internes renommés.
Bravo et merci !
Hors ligne
#3 Le 25/04/2012, à 13:18
- 6-ril
Re : script bash - renommer et déplacer photos dans des dossiers datés
Bonjour,
C'est un vieux topic mais comme j'ai un peu modifié le script :
#!/bin/bash
############################################################################################
# RedCiNe - http://leblogaperdredutemps.blogspot.com #
############################################################################################
# Script move_and_rename_files_in_folder_dated_v1b.sh #
# Licence : GNU / GPL #
############################################################################################
# Renomme et déplace les photos selon les données EXIF sous la forme : #
# ${aa}-${mm}-${jj}_${hh}.${min}.${sec}_${numero}.ext => ex : 2009-05-13_10.15.23_001.jpg #
# Les photos sont classées dans des dossiers en fonction de leur date de prise de vue #
# ex : 2009-05-13 #
# #
# !! Modification pour ne pas changer le nom du fichier !! #
# !! pour définir une date si le fichier n'en contient pas !! #
# #
############################################################################################
# Dépendances #
############################################################################################
# - Nécessite le paquet imagemagick : http://doc.ubuntu-fr.org/imagemagick #
# - Nécessite le paquet zenity #
# => sudo apt-get install imagemagick zenity #
############################################################################################
# 16/05/2009 - v.1b - Création #
############################################################################################
# Ce script est inspiré par : #
# le script exif_photos_rename_v1.1.sh de Taltan - http://www.taltan.fr - #
############################################################################################
# merci à coolgeek sur #ubuntu-fr pour son aide #
############################################################################################
## Variables
nb_param="$#" # nb de paramètres passés au script
erreur=0 # initialisation du compteur d'erreurs à 0
## dossier sélectionné par l'utilisateur
## vérifier la présence de sous-dossiers
## boucle tant que sous-dossiers
## se placer dans le sous-dossier
## vérifier la présence de photos
## boucle tant que photos
## Fonctions renommage et déplacement des fichiers
rename_move_jpeg ()
{
for filephoto in * # pour chaque fichier du répertoire courant
do # faire
extension=`echo $filephoto | awk -F "." '{print $NF}'` # création de la variable extension du fichier (ex : .jpg)
if [[ $extension == "jpg" || $extension == "JPG" || $extension == "jpeg" || $extension == "JPEG" ]] # test de l'extension
then
old_name="$filephoto" # on définie le nom du fichier actuel + l'extension
date_time=`identify -format "%[EXIF:DateTime]" "$filephoto"` # création de la variable date / heure de la photo (ex: 2009:05:16 10:21:30 )
if [[ $date_time == "" ]] ## définie une date si le fichier n'en contient pas
then
date_time="2012:04:25:12:00:00"
fi
aa=`echo $date_time | cut -d: -f1` # création de la variable année (ex : 2009)
mm=`echo $date_time | cut -d: -f2` # création de la variable mois (ex : 05)
jj=`echo $date_time | cut -d: -f3 | cut -c1-2` # création de la variable jour (ex : 16)
hh=`echo $date_time | cut -d: -f3 | cut -c4-5` # création de la variable heure (ex : 10)
min=`echo $date_time | cut -d: -f4` # création de la variable minute (ex: 21)
sec=`echo $date_time | cut -d: -f5` # création de la variable seconde (ex: 30)
## new_name=`echo ${aa}-${mm}-${jj}_${hh}.${min}.${sec}` # on définie le nouveau nom => 2009-05-16_10.21.30
new_name=`echo $filephoto | awk -F "." '{print $1}'` # création de la variable nom du fichier d'origine sans l'extension
folder_name=`echo ${aa}-${mm}-${jj}` # on définie le nom du dossier dans lequel la photo doit être transférée
echo "date & heure : "$aa $mm $jj $hh $min $sec
if [[ -d $folder_name ]] # test si le dossier existe
then
echo "le dossier "$folder_name" existe"
else
mkdir $folder_name
echo "création du dossier : "$folder_name # création du dossier
fi ## test si le dossier existe
ls $folder_name| grep -i ${new_name} > /dev/null 2>&1
if [ $? -eq 0 ] # test si un fichier portant le même nom existe : cas des photos prisent en rafale ou prisent avec des appareils différents mais ayant même date heure minute seconde
then echo "un fichier portant ce nom existe"
## test de la valeur de n des fichiers existant
numsort=2
for filephoto2 in `find $folder_name -type f | grep $new_name` # pour chaque fichier du répertoire de destination
do ## trouver la valeur maximale de numsort du/des fichiers portant le même nom
if let ${filephoto2:31:3} 2>/dev/null # test si le fichier est déjà numéroté
then
if # test de la valeur de numsort
(( ${filephoto2:31:3}>$numsort )) # tester la valeur de numsort
var=${filephoto2:31:3}
echo "var : "$var
then
(( numsort=var+1 )) # si elle est supérieur à numsort mettre numsort à jour
echo "numsort est égal à : "$numsort
echo "filephoto2:31:3 est égal à : "${filephoto2:31:3}
fi # test de la valeur de numsort
fi # test si le fichier est déjà numéroté
done ## trouver la valeur maximale de numsort
# création de la variable numérotation
if [ $numsort -gt 0 ] && [ $numsort -lt 10 ]
then numsort=00$numsort # pour les paramètres 1 à 9 rajouter 2 digit => 001, 002, 003,..., 009
fi
if [ $numsort -gt 9 ] && [ $numsort -lt 100 ]
then numsort=0$numsort # pour les paramètres 10 à 99 rajouter 1 digit => 010, 011, 012,..., 099
fi
if [ $numsort -gt 100 ]
then numsort=$numsort # pour les paramètres supérieur à 100 ne pas rajouter de digit => 100, 101, 102,...
fi
echo "numsort : "$numsort
if [[ $numsort == 002 ]] # test la valeur de la variable numsort
then
mv $folder_name"/"${new_name}.${extension} $folder_name"/"${new_name}_"001".${extension}
echo "le fichier existant "$folder_name"/"${new_name}.${extension}" a été renommé en "$folder_name"/"${new_name}_"001".${extension}
cp $old_name $folder_name"/"${new_name}_${numsort}.${extension}
echo " et le fichier courant "$old_name" a été renommé en "${new_name}_${numsort}.${extension}" et déplacé vers "$folder_name
else
cp $old_name $folder_name"/"${new_name}_${numsort}.${extension}
echo "le fichier courant "$old_name" a été renommé en " ${new_name}_${numsort}.${extension}" et déplacé vers "$folder_name
fi # test de la valeur de la variable n
else
cp $old_name $folder_name"/"$new_name.${extension}
echo "le fichier "$old_name " est renomé en " $new_name.${extension}" et déplacé vers "$folder_name
(( n=0 )) ## s'il n'existe pas renomer le fichier en cours de traitement puis réinitialisation de la variable n=0
fi # test si un fichier portant le même nom existe cas des photo prise en rafale ou prise avec des appareils différents mais ayant même date heure minute seconde
echo "#################################################"
fi ## test de l'extension
done
echo "-----------------------------------------"
echo "Fin de traitement "
echo "-----------------------------------------"
echo "OK, vous pouvez fermer !"
}
rename_move_jpeg "$@" | zenity --text-info --title "exif_photos_rename" --width=500 --height=900
## fin boucle photos
## supprimer dossier
## fin boucle sous-dossier
Merci à l'auteur de ce script.
Il ne manque plus qu'une gestion des erreurs : pour certaines de mes photos, identify me renvoie un message d'erreur.
6-Ril
Hors ligne
#4 Le 13/09/2012, à 12:02
- RedMorgan
Re : script bash - renommer et déplacer photos dans des dossiers datés
Bonjour 6-Ril
Tu peux reprendre le script à ton compte, personnellement je l'ai abandonné. Je l'avais mis en production, et je l'ai utilisé plusieurs mois sans problèmes à priori. Et puis je me suis rendu compte sur une série un peu particulière de photos qu'il en "oubliait" certaines, et comme j'étais en déplacement et non en copie, j'en ai perdu... Je n'ai jamais compris ce qui se passait (pas eu le temps d’approfondir), il manque effectivement une gestion des erreurs, et peut d'être une vérification du nombre de fichiers en sortie qui devrait être égal au nombre de fichiers en entrée.
Pour ma part j'utilise actuellement Krename, qui renomme les photos dans un format personnalisé, par contre j'ai remarqué des erreurs portant sur les secondes avec un décalage allant jusqu'à 5s. Et il ne gère pas le renommage du nouveau fichier en cas de fichiers existant dans le dossier de destination, il indique une erreur.
Ensuite je les importaient dans des dossiers avec picasa...
Mais en rédigeant ma réponse, je me suis relancer sur Krename, et j'ai peu être une solution pour replacer intégralement mon script.
Dans Krename "Files" choisir les fichiers à renommer-déplacer, dans "destination" choisir "renommer les fichiers", Passer "Plugins" il n'y pas besoin d'en activer, Enfin dans "Filesname" cliquer sur "Advanced Filename" et coller dans "Modèle" le masque suivant :
[creationdate;yyyy-MM-dd]/[creationdate;yyyy-MM-dd_HH-mm-ss]-[$[length-3];4] . $
Cela va créer des dossiers par date du jour de la prise de vue, puis y placer les photos en les renommant suivant cette exemple : 2012-09-13_12-07-31-1234.ext (jpg, gif, png...) Le modèle peut bien sur être édité à ta guise.
La plupart des noms de fichiers originaux des APN étant du genre IMG_1234.jpg ou 123_1234.jpg, je reprend les quatre derniers chiffres du nom du fichier original pour les rajouter à la fin du nouveau nom de fichier, ce qui permet d'éviter les noms de fichiers identiques, et du coup des erreurs, pour des photos prises à la même secondes (rafales).
Cette solution de renommage n'est problématique que dans le cas très rare ou il y a deux photos provenant de deux appareils différents et prise à la même secondes et portant la même fin de numéro. Soit une chance sur dix milles si les photos sont prises à la même seconde, elle doivent logiquement porter le même nom et donc cela provoque une erreur. Mais de tel cas sont si rare qu'il sont gérables à la main. le fichiers posant problème n'est tout simplement pas renommé et reste dans le dossier original.
En espérant t'avoir apporté un peu de mon expérience. Et puis ça fait toujours plaisir de savoir que quelqu'un d'autre à pu bénéficier et apprécier mon travail. Bonne journée.
Hors ligne