Сортування та перейменування зображень за датою в EXIF-інформації


9

У мене папка в фотографіях; Я хочу сортувати їх за датою в інформації EXIF ​​та перейменувати за датою (наприклад, 001.jpg, 002.jpg тощо).

Як я можу це зробити в Linux? Раніше я використовував ImageMagick для деяких основних завдань об'ємної обробки (перетворення та зміни розміру тощо), чи можливо це використовувати для цього завдання?

Відповіді:


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


1
Приклади перейменування в документації: sno.phy.queensu.ca/~phil/exiftool/… .
rwoo


2

Найпростіший спосіб - просто імпортувати файли в jbrout ... тоді (необов'язково) всі файли можуть мати імена, змінені на щось орієнтоване на час. Або ви можете виявити, що вам взагалі не потрібна зміна імен (і jbrout достатньо).


1

Я зробив невеликий і не дуже оптимізований сценарій пітона, який, на мою думку, робить те, що ви маєте намір:

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

Ви повинні встановити цю бібліотеку 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);
}

0

Поки ми перебуваємо на цьому, ось такий, який є більш стилем "програмування gonzo", в результаті bashвикористання exiftoolйого можна пустити в декілька каталогів та / або окремих файлів за один раз. Він пропускає файли з нерозпізнаними типами mime.

Він перейменовує фотографії за допомогою DateTimeOriginalтегу EXIF ​​(тому результат не є, 001.jpgале 2015-12-22_14:43:15.jpg.

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

Може бути корисним: relabel_photo_with_datetimeoriginal.sh

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.