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

14884
skazhy

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

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

8

7 ответов на вопрос

19
user285690

On Linux you can use the command exiftool. For some reason the online manual does not contain the "RENAMING EXAMPLES" section which gave me the essential hint.

For JPG only files the following command invocation should do the job:

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

Explanation:

  • -r is for recursion
  • '-FileName<CreateDate' tells exiftool to rename the file accordingly to its EXIF tag CreateDate (you can try others like ModifyDate though)
  • -d '%Y-%m-%d/%H_%M_%S%%-c.%%le' tells how to build the filename string from the date source "CreateDate" (the "%-c" will append a counter in case of file collisions, the "%le" stands for "lower cased file extension")
    • Note: I used "-FileName<..." here for renaming the files and moving it to another folder within one step. The manual points out that you have to use the "-Directory<..." syntax for folder operations. It worked for me this way though.

You should spend some time reading the manual of this powerful tool. Maybe there is an even shorter way :D

Примеры переименования в документации: http://www.sno.phy.queensu.ca/~phil/exiftool/exiftool_pod.html#renaming_examples. rwoo 8 лет назад 1
5
harrymc

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

2
mcepl

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

1
celebdor

Я сделал небольшой и не очень оптимизированный скрипт на 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 
Вы должны установить эту библиотеку http://tilloy.net/dev/pyexiv2/ celebdor 13 лет назад 0
1
Patrik Wallander

Чтобы заставить его работать в 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
frankmannen

В 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
David Tonhofer

В то время как мы находимся в этом, вот тот, который является более стилем "гонзо программирования", в 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

Похожие вопросы