J'importe souvent des photos et des vidéos (ayant principalement des extensions JPG et MOV) à partir d'appareils photo numériques et de tablettes sur mon PC, et j'aimerais idéalement les voir triés selon les dates et heures auxquelles ils ont été pris déjà présents dans leurs données EXIF. Et d'où mon souhait de les renommer tous de préférence en utilisant un simple Script Nautilus en insérant de préférence les horodatages avant chaque nom de fichier.
Jusqu'à présent, je n'ai réussi qu'à rassembler le script Nautilus suivant, qui, à mon avis, est loin d'être parfait :
for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i""
done
Ce que je n'aime pas dans cette méthode de renommage, ce sont les deux-points utilisés dans les horodatages EXIF (par exemple "2013:09:03 20:55:09_IMG_0108.JPG") qui pourrait créer des problèmes lors du transfert ultérieur de ces fichiers vers d'autres environnements (par exemple Windows).
Cette commande (utilisant exiv2 au lieu de exiftool ) permet de manipuler facilement la date et l'heure, mais son inconvénient est qu'il ne fonctionne pas sur les fichiers vidéo (par exemple, MOV) :
exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"
J'espère donc que quelqu'un pourra trouver une meilleure solution. Et ce serait magique s'il réussissait même à convertir les noms de fichiers et les extensions d'origine en minuscules !
Réponse acceptée :
Ce que je n'aime pas dans cette méthode de renommage, ce sont les deux-points utilisés dans les horodatages EXIF (par exemple "2013:09:03 20:55:09_IMG_0108.JPG") qui pourraient créer des problèmes lors du transfert ultérieur de ces fichiers vers d'autres environnements ( ex. Windows).
Vous pouvez exécuter le schéma de nommage via sed
, pour remplacer les deux-points par des tirets et les espaces par des traits de soulignement, comme ceci :
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"
Quant à mettre le tout en minuscules, vous pouvez utiliser rename
:
rename 's/(.*)/\L$1/' file.JPG
## or
rename 's/(.*)/\L$1/' *.*
Ou vous pouvez le faire dans votre script en utilisant sed
, comme dans :
j=$(echo "$i" | sed -e 's/\(.*\)/\L\1/')
…puis utilisez le $j
variable à la place du dernier $i
de votre mv
doubler. Cette méthode sed est légèrement plus portable (si cela vous intéresse) car différentes distributions Linux ont des commandes de renommage différentes, tandis que sed est universel.
Ou, alternativement, le script peut être modifié comme suit pour effectuer la conversion du nom de fichier en minuscules au début en utilisant tr
à la place :
for arg
do
tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done
Pour exécuter des commandes légèrement différentes pour différents types de fichiers, une instruction bash case peut être utilisée dans ce script. Par exemple :
#! /usr/bin/env bash
for filename in ./*
do
tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
case "$filename" in
*.MOV|*.mov)
mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
;;
*.JPG|*.jpg)
mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
;;
*)
echo 'Not a *.jpg or a *.mov!'
;;
esac
done
Dans cet exemple, renommer les fichiers MOV qui ont des horodatages CreateDate TOUT NOMBRE d'heures APRÈS OU AVANT les fichiers JPG est ajusté en utilisant une autre donnée EXIF (-tur) et en supprimant ce suffixe de différence de temps, et il peut être nécessaire de changer -tur partie selon l'emplacement défini dans le système.