J'importe souvent photos et vidéos (principalement avec 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 par - les dates et heures auxquelles ils ont été pris déjà présents dans leurs données EXIF. Et par conséquent, je souhaite les renommer tous de préférence en utilisant un simple Nautilus Script en insérant de préférence les horodatages avant chaque nom de fichier.
Je n’ai réussi jusqu’à présent à réunir que le script Nautilus suivant, que je crois 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 changement de nom, c’est le deux points utilisés dans les horodatages EXIF (par exemple, "2013: 09: 03 20: 55: 09_IMG_0108.JPG"), ce qui pourrait poser des problèmes lors du transfert. ces fichiers ultérieurement dans d'autres environnements (par exemple Windows).
Cette commande (en utilisant exiv2 au lieu de exiftool) permet de manipuler commodément les horodatages mais son inconvénient est qu'elle ne fonctionne pas en vidéo (par exemple, MOV ) fichiers:
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!
Ce qui ne me plaît pas dans cette méthode de changement de nom, ce sont les deux points utilisés dans les horodatages EXIF (par exemple, "2013: 09: 03 20: 55: 09_IMG_0108.JPG"), ce qui peut créer des problèmes lors du transfert ultérieur de ces fichiers vers d'autres environnements ( par exemple Windows).
Vous pouvez exécuter le schéma de nommage via sed
, pour remplacer les deux points par des tirets et des espaces par des traits de soulignement, comme suit:
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"
Pour rendre le tout minuscule, 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 la variable $j
à la place du $i
final de votre ligne mv
. Cette méthode sed est légèrement plus portable (si cela vous tient à cœur) car différentes distributions Linux ont différentes commandes de changement de nom, tandis que sed est universel.
Ou bien, le script peut être modifié comme suit pour effectuer la conversion du nom de fichier en minuscule 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, vous pouvez utiliser une instruction cash bash 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 des fichiers MOV comportant des horodatages CreateDate TOUT NOMBRE d’heures APRÈS OR AVANT que les fichiers JPG soit ajusté à l’aide de données EXIF (-tur) et en supprimant ces données. ce suffixe de différence de temps, et il pourrait être nécessaire de changer - tur partie en fonction de l’emplacement défini dans le système.
Je devais renommer mes photos et trouver cette question ici - je viens de découvrir que exiftool
le gère de manière native:
De http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html
exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR
Si vous voulez garder une trace du nom de fichier d'origine et écrire des minuscules d'extension:
exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]
La même chose fonctionne aussi avec le nom de fichier entier en minuscule:
exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
Je sais que vous avez dit que vous préfériez un script. Cependant, si vous êtes ouvert à une application gratuite Java, vous pouvez utiliser AmoK Exif Sorter
J'utiliserais krename
pour cela. Il
Le pyrenamer ne fonctionnera pas sur mon nouvel Ubuntu 16.04 installé, donc je dois trouver un autre moyen de résoudre ce problème aussi.
J'ai des fichiers tels que IMG_0001.JPG, IMG_0002.JPG, ... dans un dossier. Consultez ce site, https://stackoverflow.com/questions/917260/can-var-parameter-expansion-expressions-be-nested-in-bash
Installez d'abord "exiv2" et j'ai écrit la ligne de commande suivante:
pour img dans $ (ls *. [Jj] [Pp] [Gg] 2>/dev/null); do exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" renommer "$ img"; terminé
Les noms de fichiers de sortie sont YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... etc. Même si les photos ont été prises à la même seconde, le numéro de série de la photo d'origine fera la différence.