Сортировка и переименование изображений по дате в EXIF-информации

Сортировка и переименование изображений по дате в EXIF-информации

У меня беспорядок в папке с фотографиями; я хочу отсортировать их по дате в EXIF-информации и переименовать в соответствии с датой (например, 001.jpg, 002.jpg и т. д.).

Как это сделать в Linux? Я уже использовал ImageMagick для некоторых базовых задач массовой обработки (конвертация и изменение размера и т. д.), возможно ли использовать его для этой задачи?

решение1

Вы можете использоватьexiftool. По какой-то причине в онлайн-руководстве отсутствует раздел «ПРИМЕРЫ ПЕРЕИМЕНОВАНИЯ», который дал мне необходимую подсказку.

Для файлов JPG достаточно выполнить следующую команду:

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

Объяснение:

  • -rдля рекурсии
  • '-FileName<CreateDate'сообщает exiftool о необходимости переименовать файл в соответствии с его тегом EXIF CreateDate​​(хотя вы можете попробовать и другие варианты ModifyDate)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le'сообщает, как создать строку имени файла из источника даты " CreateDate" (" %-c" добавит счетчик в случае конфликтов файлов, " %le" обозначает "расширение файла в нижнем регистре")
  • Примечание: Я использовал " -FileName<..." здесь для переименования файлов и перемещения их в другую папку за один шаг. В руководстве указано, что для операций с папками необходимо использовать синтаксис " -Directory<...". У меня это сработало.

Вам стоит потратить немного времени на чтение руководства этого мощного инструмента. Может быть, есть еще более короткий путь :D

решение2

Попробуйте этот бесплатный продукт:Сортировщик Exif AmoK.

решение3

Самый простой способ — просто импортировать файлы в jbrout... тогда (опционально) все файлы могут иметь измененные имена на что-то ориентированное на время. Или вы можете обнаружить, что вам вообще не нужно менять имена (и jbrout достаточно).

решение4

Чтобы это заработало в Debian Lenny, попробуйте следующее:

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

Связанный контент