Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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. smile Bonne journée.

Hors ligne