Trier et renommer les images par date dans les informations EXIF


9

J'ai un gâchis dans mon dossier de photos; Je veux les trier selon la date dans les informations EXIF ​​et les renommer selon la date (comme 001.jpg, 002.jpg et ainsi de suite).

Comment puis-je faire cela sous Linux? J'ai déjà utilisé ImageMagick pour certaines tâches de base de traitement en masse (conversion et redimensionnement, etc.), est-il possible de l'utiliser pour cette tâche?

Réponses:


21

Sous Linux, vous pouvez utiliser la commande exiftool . Pour une raison quelconque, le manuel en ligne ne contient pas la section "RENOMMER DES EXEMPLES" qui m'a donné l'indication essentielle.

Pour les fichiers JPG uniquement, l'invocation de commande suivante devrait faire le travail:

exiftool -r '-FileName<CreateDate' -d '%Y-%m-%d/%H_%M_%S%%-c.%%le' <yourFolder>

Explication:

  • -r est pour la récursivité
  • '-FileName<CreateDate'indique à exiftool de renommer le fichier en fonction de sa balise EXIF CreateDate(vous pouvez essayer d'autres comme ModifyDatesi)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'indique comment construire la chaîne de nom de fichier à partir de la source de date " CreateDate" (le " %-c" ajoutera un compteur en cas de collision de fichiers, le " %le" signifie "l'extension de fichier inférieure")
    • Remarque : J'ai utilisé " -FileName<..." ici pour renommer les fichiers et les déplacer vers un autre dossier en une seule étape. Le manuel souligne que vous devez utiliser la -Directory<...syntaxe " " pour les opérations sur les dossiers. Cela a fonctionné pour moi de cette façon.

Vous devriez passer un peu de temps à lire le manuel de cet outil puissant. Il existe peut-être un moyen encore plus court: D


1
Les exemples de changement de nom dans la documentation: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo


2

Le moyen le plus simple consiste à simplement importer des fichiers dans jbrout ... puis (éventuellement) tous les fichiers peuvent avoir des noms changés en quelque chose de temporel. Ou vous pouvez constater que vous n'avez pas du tout besoin de changer les noms (et jbrout est suffisant).


1

J'ai fait un petit script python peu optimisé qui, à mon avis, fait ce que vous avez l'intention:

1 import pyexiv2, sys, os, time, datetime, random
2 dirname = sys.argv[1]
3 flist=os.listdir(dirname)
4 dic = dict()
5 for fname in flist:
6     metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
7     metadata.read()
8     tag = metadata['Exif.Image.DateTime']
9     timestamp = int(time.mktime(tag.value.timetuple()))
10     #print fname, ' ', tag.value, ' ', timestamp
11     try:
12         dic[timestamp] = fname
13     except:
14         print fname, ' not processed.'
15 
16 keys = dic.keys()
17 keys.sort()
18 i = 0 
19 for k in keys:
20     os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
21     i+=1

Vous devez installer cette bibliothèque tilloy.net/dev/pyexiv2
celebdor

1

Pour le faire fonctionner dans Debian Lenny, essayez ceci:

import pyexiv2, sys, os, time, datetime, random
dirname = sys.argv[1]
flist=os.listdir(dirname)
dic = dict()
for fname in flist:
    image = pyexiv2.Image(sys.argv[1]+'/'+fname) 
    #metadata = pyexiv2.ImageMetadata(sys.argv[1]+'/'+fname)
    #metadata.read()
    image.readMetadata() 
    tag = image['Exif.Image.DateTime']
    timestamp = int(time.mktime(tag.timetuple()))
    #print fname, ' ', tag.value, ' ', timestamp
    try:
    dic[timestamp] = fname
    except:
    print fname, ' not processed.'

keys = dic.keys()
keys.sort()
i = 0 
for k in keys:
    os.rename(sys.argv[1]+'/'+dic[k], sys.argv[1]+'/'+str(i)+'.jpg')
    i+=1

1

En php, j'ai fait quelque chose comme ça:

<?php

$path = "./path/to/images";
$files = scandir($path);

foreach ( $files as $file )
{
    if ( $file[0] === "." )
    {
        continue;
    }
    $ext = end(explode(".", $file));

    $suffix = "image";

    $exif = exif_read_data($path."/".$file, 'EXIF');
    $datetime = str_replace("/","-", $exif['DateTimeDigitized']);

    rename($path."/".$file, $path."/".$datetime.$suffix.".".$ext);
}

0

Pendant que nous y sommes, en voici un qui est plus de style "programmation gonzo", en bash, utilisant exiftool, il peut être lâché sur plusieurs répertoires et / ou fichiers individuels en une seule fois. Il ignore les fichiers qui ont des types MIME non reconnus.

Il renomme les photos à l'aide de la DateTimeOriginalbalise EXIF ​​(donc le résultat n'est pas 001.jpgmais 2015-12-22_14:43:15.jpg.

S'il y a un conflit d'attribution de noms, les numéros d'index sont appliqués: 2015-12-22_14:50:57.1.jpg.

Peut être utile: relabel_photo_with_datetimeoriginal.sh

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.