8

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

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

7 ответов7

20

В 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

5

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

2

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

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

Я сделал небольшой и не очень оптимизированный скрипт на 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
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);
}
0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .