Изменение даты фотографии, хранящейся в файле фотографии, из имени файла?

Я использую приложение Google PhotScan для сканирования всех моих старых фотографий, сделанных до возраста цифровых камер, и сохраняю эти фотографии, используя дату фотографии (пример: 19821011_trip.jpg, yyyymmdd_trip.jpg).

Но этот метод сохраняет текущую дату съемки фотографии с помощью приложения в свойствах фотографии, поэтому я пытался написать скрипт, который будет извлекать информацию о дате из имени файла фотографии и исправлять дату, которая хранится в файле фотографии. свойства.

С нетерпением жду вашей помощи.

2 ответа

exiftool в помощь

Я предполагаю, что вы хотите изменить EXIF-данные отсканированных изображений в соответствии с отметкой времени из имени файла изображения (а не с момента создания файла, например, например, ls -l показывает).

К счастью, для этого есть удобный инструмент exiftool, Если он еще не установлен, запустите

sudo apt install libimage-exiftool-perl

первый. exiftool находится в стандартных репозиториях. Он может отображать и манипулировать как именами файлов, так и данными EXIF. Например, можно перемещать файлы в соответствии с атрибутом EXIF CreateDate и перемещать файлы в такие подкаталоги, как

2018
    Jan
       img0001.jpg
       img0002.jpg
    Feb
       img0003.jpg
       img0004.jpg

и так далее. Но это другая история, и вы хотите ее наоборот.

Давайте возьмем ваш 19821011_trip.jpg в качестве примера и установите все три атрибута DateTimeOriginal, CreateDate и ModifyDate, чтобы Oct 11, 1982, exiftool имеет параметр для анализа имени файла для чего-то похожего на дату и метку времени, а затем устанавливает все эти даты сразу в это значение. К сожалению, имя файла должно содержать метку времени (ЧЧММСС), чтобы это работало, например так:

exiftool "-alldates<filename" 19821011_130000_trip.jpg

Это установит три атрибута даты, упомянутых выше Oct 11, 1982, 01:00:00 PM, Поскольку ваше имя файла не содержит такой части HHMMSS, мы должны немного изменить параметр:

exiftool '-alldates<${filename;$_=substr($_,0,8)} 13:00:00' 19821011_trip.jpg 

Это выберет первые 8 символов из имени файла, добавьте 13:00:00 и, наконец, разобрать эту строку (19821011 13:00:00) построить правильную дату для всех трех атрибутов. exiftool довольно хорошо разбирает временные метки, но ему нужна как минимум часть ЧЧММ после даты.

Вы также можете запустить exiftool на весь каталог:

exiftool '-alldates<${filename;$_=substr($_,0,8)} 13:00:00' .

Затем он обработает все найденные изображения. Не беспокойтесь, он делает резервные копии всех измененных файлов.

Резюме:

me@ubuntu:~> exiftool -alldates 19821011_trip.jpg
(no output)

me@ubuntu:~> exiftool '-alldates<${filename;$_=substr($_,0,8)} 13:00:00' 19821011_trip.jpg 
    1 image files updated

me@ubuntu:~> exiftool -alldates 19821011_trip.jpg 
Date/Time Original              : 1982:10:11 13:00:00
Create Date                     : 1982:10:11 13:00:00
Modify Date                     : 1982:10:11 13:00:00

Вы могли бы сделать это с touch и петля как

for i in *.jpg; do
  touch -d"${i%_trip.jpg}" "$i"
done

но это не очень точно, поскольку имена ваших файлов содержат только дату без какой-либо информации о времени, поэтому время файла будет установлено на 00:00:00.000000000. Оставайся со мной для лучшего пути.

Каждая обычная фотография имеет заголовок Exif, который содержит правильную отметку времени, когда была сделана фотография, при условии, что настройки даты и времени камеры были правильными. Я всегда предпочитаю использовать это, это отказоустойчиво и легко с jhead из пакета jhead, увидеть man jhead для деталей. Некоторые полезные опции:

-ft    Sets the file's system time stamp to what is stored in the Exif header.    
-n[format_string]
       This option causes files to be renamed and/ or mmoved using the date information from the Exif header "DateTimeOriginal" field.  If the file is not an Exif file, or the DateTimeOriginal
       does not contain a valid value, the file date is used.  If the new name contains a '/', this will be interpreted as a new path, and the file will be moved accordingly.

Команда переименовать все jpg файлы в текущем каталоге в соответствии с их временной меткой заголовка Exif и изменением системной временной метки файла могут быть:

jhead -ft -n'%Y%m%d_trip' *.jpg

jhead достаточно не перезаписывать ваши файлы, если имя файла уже существует:

Если целевое имя уже существует, к имени будут добавлены "a", "b", "c" и т. Д., Если имя не заканчивается буквой, в этом случае к нему добавляются "0", "1", "2" и т. Д.

Если ваши файлы не имеют заголовка Exif, могут помочь следующие параметры:

-mkexif
       Creates  minimal exif header. Exif header contains date/time, and empty thumbnail fields only. Date/time set to file time by default. Use with -rgt option if you want the exif header to
       contain a thumbnail. Note that exif header creation is very limited at this time, and no other fields can be added to the exif header this way.
-dsft  Sets the Exif timestamp to the file's timestamp. Requires an Exif header to pre-exist. Use -mkexif option to create one if needed.
Другие вопросы по тегам