Renommez les images en temps exif: créez des noms de fichiers uniques


11

Si je renomme des images via exiv en date et heure exif, je fais ce qui suit:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

Maintenant, il peut arriver que les images aient exactement le même horodatage (y compris les secondes). Comment puis-je rendre le nom de fichier unique automatiquement?

La commande doit être stable en ce sens que si je l'exécute à nouveau sur la même structure de répertoires (peut-être après l'ajout de nouvelles images), les images déjà renommées ne doivent pas changer et si des images avec des noms de fichiers déjà existants sont ajoutées, les nouveaux noms de fichiers doivent être uniques ainsi que.

Ma première tentative a été simplement de laisser le nom de base d'origine dans le nom de fichier résultant, mais la commande ne serait pas stable dans le sens ci-dessus.


1
Extrayez l'horodatage, créez le nom de fichier, recherchez le nom de fichier existant, modifiez (ajoutez un suffixe ou similaire) s'il est présent, puis mvle fichier.
Kusalananda

Existe-t-il également un moyen plus direct en ajoutant une option à la commande exiv2?
étudiant

Donc , la réponse à l' aide exiftool serait quelque chose comme: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Vous pourriez peut-être transformer votre commentaire en réponse.
étudiant du

Réponses:


17

Vous voudrez peut-être essayer à la jheadplace ce qui fait cela prêt à l'emploi (avec a, b... zsuffixes permettant jusqu'à 27 fichiers avec la même date) et n'a pas le problème de stabilité mentionné par @meuh:

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

Ou en utilisant exiftool(exemple dans la page de manuel):

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(ici en %-cétant un suffixe numérique commençant par -)


3

Ma version de exiv2(0.25 001900) vous demandera interactivement quoi faire lorsque le nom de fichier existe déjà.

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

En ajoutant une option, -Fil ajoutera automatiquement un supplément _1(ou _2etc) au nom.

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

Si la commande est exécutée une deuxième fois, elle indique:

This file already has the correct name

et ne fait rien, mais il se confond s'il y a la _1pièce, et la renommera _2. Il basculera comme ceci de manière non destructive à chaque exécution. Vous pouvez ignorer cela si vous le souhaitez, ou modifier votre findmodèle pour ignorer les fichiers correspondant au modèle de date avec une _pièce.

Par exemple, le modèle d'expression régulière pour le format de date commence [0-9]{4}_[0-9]{2}_.... Pour simplifier, je vais juste chercher un mélange de 20 caractères de l'ensemble 0..9et _, qui est regex [0-9_]{20}. Pour cela, le suffixe de _suivi d'au moins 1 chiffre à rechercher est _[0-9]{1,}.jpg. Étant donné que l'expression régulière doit correspondre à l'ensemble du chemin, et pas seulement au nom de base, l'expression régulière finale, y compris le répertoire, l'est .*/[0-9_]{20}_[0-9]{1,}.jpg.

Vous pouvez donc utiliser une recherche comme:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...

1

Exiv2 peut le gérer seul. J'ai également passé beaucoup de temps à chercher de l'aide à ce sujet, jusqu'à ce que j'aille voir le manuel exiv2. L'option -F résout ce problème.

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

Il ajoutera un _N à la fin si le fichier existe déjà.

Et pour ceux qui recherchent une option permettant de créer un dossier.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *

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 de 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.