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

9

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

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

skazhy
источник

Ответы:

21

В Linux вы можете использовать команду 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

user285690
источник
1
Примеры переименования в документации: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo
2

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

mcepl
источник
1

Я сделал небольшой и не очень оптимизированный скрипт на python, который, по-моему, делает то, что вы намереваетесь:

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
celebdor
источник
Вы должны установить эту библиотеку tilloy.net/dev/pyexiv2
celebdor
1

Чтобы заставить его работать в 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
Патрик Валландер
источник
1

В php я сделал что-то вроде этого:

<?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
источник
0

В то время как мы находимся в этом, вот тот, который является более стилем "гонзо-программирования", в bashиспользовании exiftoolон может быть освобожден на нескольких каталогах и / или отдельных файлах за один раз. Он пропускает файлы, которые имеют нераспознанные типы пантомимы.

Он переименовывает фотографии с помощью DateTimeOriginalтега EXIF ​​(поэтому результат не является, 001.jpgно 2015-12-22_14:43:15.jpg.

Если есть конфликт имен, применяются порядковые номера: 2015-12-22_14:50:57.1.jpg.

Может быть полезно: relabel_photo_with_datetimeoriginal.sh

Дэвид Тонхофер
источник