Ordenar y renombrar imágenes por fecha en información EXIF

9

Tengo un desastre en mi carpeta de fotos; Quiero ordenarlos según la fecha en la información EXIF ​​y cambiarles el nombre según la fecha (como 001.jpg, 002.jpg, etc.).

¿Cómo puedo hacer esto en Linux? He usado ImageMagick para algunas tareas básicas de procesamiento masivo antes (conversión y cambio de tamaño, etc.), ¿es posible usarlo para esta tarea?

skazhy
fuente

Respuestas:

21

En Linux puedes usar el comando exiftool . Por alguna razón, el manual en línea no contiene la sección "EJEMPLOS DE RENAMING" que me dio la pista esencial.

Para archivos solo JPG, la siguiente invocación de comando debería hacer el trabajo:

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

Explicación:

  • -r es por recursividad
  • '-FileName<CreateDate'le dice a exiftool que cambie el nombre del archivo de acuerdo a su etiqueta EXIF CreateDate( ModifyDateaunque puede probar otros como )
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'le dice cómo construir la cadena del nombre de archivo desde la fuente de fecha " CreateDate" (la " %-c" agregará un contador en caso de colisiones de archivos, la " %le" significa "extensión de archivo en minúsculas")
    • Nota : Usé " -FileName<..." aquí para renombrar los archivos y moverlos a otra carpeta en un solo paso. El manual señala que debe usar la -Directory<...sintaxis " " para las operaciones de carpeta. Sin embargo, funcionó para mí de esta manera.

Debería pasar algún tiempo leyendo el manual de esta poderosa herramienta. Tal vez hay una forma aún más corta: D

usuario285690
fuente
1
Los ejemplos de cambio de nombre en la documentación: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo
2

La forma más simple es importar archivos a jbrout ... luego (opcionalmente) todos los archivos pueden tener nombres cambiados a algo orientado al tiempo. O puede encontrar que no necesita cambiar nombres en absoluto (y jbrout es suficiente).

mcepl
fuente
1

Hice un script python pequeño y no muy optimizado que creo que hace lo que pretendes:

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
celebrador
fuente
Tienes que instalar esta biblioteca tilloy.net/dev/pyexiv2
celebrador
1

Para que funcione en Debian Lenny intente esto:

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
Patrik Wallander
fuente
1

En php hice algo como esto:

<?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);
}
Frankmannen
fuente
0

Mientras estamos en ello, aquí hay uno que tiene más estilo de "programación gonzo", al bashusarlo exiftool, se puede soltar en varios directorios y / o archivos individuales de una sola vez. Omite archivos que tienen tipos mime no reconocidos.

Cambia el nombre de las fotos con la DateTimeOriginaletiqueta EXIF ​​(por lo que el resultado no es 001.jpgpero 2015-12-22_14:43:15.jpg.

Si hay un conflicto de nombres, se aplican los números índice: 2015-12-22_14:50:57.1.jpg.

Puede ser útil: relabel_photo_with_datetimeoriginal.sh

David Tonhofer
fuente