Comment renommer plusieurs photos et vidéos basées sur des données EXIF?

11

J'importe souvent des photos et des vidéos (ayant pour la plupart des extensions JPG et MOV) depuis des appareils photo numériques et des tablettes vers mon PC, et j'aimerais idéalement les voir triées en fonction des dates et heures auxquelles elles ont été prises déjà présentes dans leurs données EXIF. Et d'où mon souhait de les renommer tous de préférence à l'aide d'un simple Nautilus Script 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, je pense, 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 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 pourrait créer des problèmes lors du transfert de ces fichiers plus tard vers d'autres environnements ( par exemple Windows).

Cette commande (en utilisant exiv2 au lieu d' exiftool ) permet de manipuler facilement les horodatages mais son inconvénient est qu'elle 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 extensions d'origine en minuscules!

Sadi
la source
En plus des bonnes réponses ci-dessous, vous devriez également consulter pyRenamer . Je n'ai aucune expérience de son utilisation avec des fichiers vidéo (ont-ils des données EXIF?) Mais je peux dire que c'est excellent pour les photos. Il peut également modifier les extensions de fichiers en minuscules.
Tom Brossman

Réponses:

6

Ce que je n'aime 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 pourrait créer des problèmes lors du transfert de ces fichiers plus tard vers d'autres environnements ( par exemple Windows).

Vous pouvez exécuter le schéma de nommage sedpour 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"

Quant à rendre 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 la $jvariable à la place de la finale $ide votre mvligne. Cette méthode sed est légèrement plus portable (si cela vous importe) 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 minuscules au début en utilisant à la trplace:

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 N'IMPORTE QUEL 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 décalage horaire, et il peut être nécessaire de changer -tur part selon l'emplacement défini dans le système.

evilsoup
la source
Malheureusement, je n'ai pas pu comprendre comment convertir les noms de fichiers en minuscules comme vous le suggérez (insérer cette ligne ci-dessus et changer la dernière $ipour $jne rien faire). Au lieu de cela, j'ai inséré la conversion du nom de fichier en minuscules au début et j'ai pris la liberté d'ajouter cela comme une autre option (qui fonctionnait au moins pour moi) à la fin de votre réponse afin que je puisse accepter votre réponse. Bien sûr, vous pouvez modifier davantage votre réponse à votre guise.
Sadi
@sadi le regardant avec des yeux neufs, je peux voir ce que je faisais mal avec la commande sed. La dernière version fonctionnera, bien sûr, si la méthode tr fonctionne pour vous, c'est très bien (j'ai un soupçon discret que la solution tr pourrait être légèrement plus efficace en fait, bien que la sed gère mieux les caractères non anglais)
evilsoup
Je vous remercie. Je me demande si vous pouvez également m'aider à améliorer encore ce script en utilisant une commande pour les fichiers MOV et une autre pour les autres dans le même sens: si [l'extension est MOV] bla bla; sinon bla bla. La raison en est que je viens de réaliser que le tampon "CreateDate" dans mes fichiers MOV (à partir de l'iPad) a étrangement +4 heures et je dois utiliser une autre option (CreateDate-tur) pour obtenir un ordre précis de photos et de vidéos .
Sadi
La meilleure façon pour cela (à mon avis) est d'utiliser une déclaration de cas; voici quelque chose pour vous aider à démarrer. Vous pouvez également utiliser une instruction if, mais les instructions case peuvent être plus facilement développées pour des extensions de fichier supplémentaires. Recherchez «bash case statement» sur Internet pour plus d'informations.
evilsoup
Mille mercis!!! J'ajouterai également cette option à la réponse, si cela ne vous dérange pas.
Sadi
13

J'avais besoin de renommer mes photos et j'ai trouvé cette question ici - je viens de découvrir que exiftoolcela la gère nativement:

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 souhaitez garder une trace du nom de fichier d'origine et écrire l'extension en minuscules:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

La même chose fonctionne également avec le nom de fichier entier en minuscules:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
DerekC
la source
DIR doit être le dossier où les photos sont attribuées. Si nous avons déjà ouvert un terminal dans le dossier où nous voulons exécuter la commande, nous devons remplacer DIR pour. Et si vous souhaitez ajouter un préfixe, au nom de fichier (c'est-à-dire IMG_), il doit être inséré avant la chaîne de date sans aucune citation. Voici un exemple: exiftool -d IMG_% Y% m% d_% H% M% S %% - c. %% e "-filename <CreateDate".
Nothor
2

Je sais que vous avez dit que vous préfériez un script, cependant, si vous êtes ouvert à une application Java gratuite, vous pouvez utiliser AmoK Exif Sorter

entrez la description de l'image ici

optique
la source
1

J'utiliserais krenamepour ça. Il

  • affiche un aperçu en direct
  • permet d'annuler
  • peut aller récursivement dans dir
  • permet de renommer plusieurs modèles
  • autorise les globes et les expressions rationnelles dans les modèles
  • se souvient de l'histoire
Adobe
la source
0

Le pyrenamer ne fonctionnera pas sur mon nouvel Ubuntu 16.04 installé, donc je dois aussi trouver un autre moyen de résoudre ce problème.

J'ai des fichiers tels que IMG_0001.JPG, IMG_0002.JPG, ... dans un dossier. Consultez ce site, /programming/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 des fichiers de sortie sont YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... etc. Même les photos ont été prises à la même seconde, le numéro de série de la photo originale fera la différence.

chuck lee
la source