суббота, 5 марта 2016 г.

Переименование файлов на основе EXIF-информации

Случилось пренеприятнейшее событие, в один момент мой телефон начал терять файлы из каталога DCIM. Как оказалось, что проблемные файлы при повреждении файловой системы можно найти в каталоге LOST.DIR. Не буду вдаваться в особые подробности, как мне удалось спасти остатки файлов. Не помог testdisk (photorec), удалось лишь скопировать содержимое флешки rsync'ом, т.к. под виндой копирование при попадании на совсем битые файлы растягивалось на непредсказуемое время.

И так, после копирования, можно было найти в LOST.DIR, огромное количество файлов без расширений. По смыслу можно догадаться, что это вероятно и есть jpg и mp4. Подумал было разобрать всю эту мешанину файлов каким-нибудь сценарием на Bash, но вышло так, что файловый менеджер в xubuntu может отображать тип по EXIF-информации, я просто отсортировал файлы по типу и скопировал их в каталоги jpg и mp4.

Теперь осталось добавить к файлам расширения. Я это сделал в Total Commander, через инструмент группового переименования, но нет проблем написать сценарий, который добавит расширения к уже известным нам файлам.

Но всё же сложно понять что это за фото, по именам файлов:
  • 1015.jpg
  • 10239.jpg
  • 10270.jpg
  • 1063.jpg
  • 10706.jpg
  • 10759.jpg
  • 10798.jpg
  • 10831.jpg
  • 10879.jpg
  • 10920.jpg
Поэтому написал два сценария:

Сценарий для переименования jpg файлов в текущем каталоге на основе EXIF-информации

Сценарий требует наличия пакета exiv2.
#!/bin/bash
# Script need exiv2.
# apt-get install exiv2
# yum install exiv2
#
ls -1 *.jpg | while read fn
do
export dt=`exiv2 "$fn" | grep "Отметка времени снимка" | awk '{ print $4"_"$5 }' | tr ":" "-"`
export ft=`exiv2 "$fn" | grep "Отметка времени снимка" | awk '{ print $4" "$5 }' | tr ":" " "`
export fdate=`echo $ft | awk '{ print $1""$2""$3""$4""$5"."$6 }'`
mv "$fn" ./"$dt".jpg && touch -t "$fdate" ./"$dt".jpg
done
echo Finish!

Сценарий для переименования mp4 файлов в текущем каталоге на основе метаданных из MP4

Сценарий требует наличия пакета perl-Image-ExifTool.
#!/bin/bash
# Script need exiftool.
# apt-get perl-Image-ExifTool
# yum install perl-Image-ExifTool
#
ls -1 *.mp4 | while read fn
do
export dt=`exiftool "$fn" | grep "Media Create Date" | awk '{ print $5"_"$6 }' | tr ":" "-"`
export ft=`exiftool "$fn" | grep "Media Create Date" | awk '{ print $5" "$6 }' | tr ":" " "`
export fdate=`echo $ft | awk '{ print $1""$2""$3""$4""$5"."$6 }'`
mv "$fn" ./"$dt".mp4 && touch -t "$fdate" ./"$dt".mp4
done
echo Finish!
Запускаем их в каталоге с файлами, и файлы переименовываются в формат ГГГГ-ММ-ДД_ЧЧ-ММ-СС, так, же из EXIF берётся информация о создании файла и устанавливается с помощью touch, для того, чтобы файлы можно было сортировать по времени.

В итоге получается список вот такого типа:
  • 2016-02-26_16-03-22.jpg
  • 2016-02-27_12-58-40.jpg
  • 2016-02-27_12-58-58.jpg
  • 2016-02-28_17-41-14.jpg
  • 2016-03-02_18-20-18.jpg
  • 2016-03-02_18-20-22.jpg
  • 2016-03-04_13-45-52.jpg
Сценарии написаны не идеально, делюсь просто рабочим решением.

Комментариев нет:

Отправить комментарий