web-dev-qa-db-fra.com

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

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!

9
Sadi

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.

6
evilsoup

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]
11
DerekC

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

enter image description here

2
opticyclic

J'utiliserais krename pour cela. Il

  • montre l'aperçu en direct
  • permet d'annuler
  • peut aller récursivement dans dir
  • permet de renommer plusieurs modèles
  • autorise les globs et les regexps dans les patterns
  • se souvient de l'histoire
1
Adobe

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.

0
chuck lee