Изменение даты фотографии, хранящейся в файле фотографии, из имени файла?
Я использую приложение 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.