6

Я имею дело с неорганизованной большой группой медиафайлов, захваченных с помощью нескольких разных камер и видеокамер, и я хотел бы использовать exiftool в сценарии bash для переименования каждого файла с указанием даты и времени создания, производителя и модели.

С помощью этой команды изображения переименовываются как я хочу:

exiftool -m -P '-filename<${DateTimeOriginal}_${Make}_${Model}.%e' myfile.jpg

Я уже знаю, что могу форматировать дату и время, используя опцию -d FMT, но я опускаю ее для ясности.

Вот вместо этого проблемы, с которыми я сталкиваюсь с видео DSLR "* .mov":

  1. exiftool удаляет расширение .mov, даже если вместо модели «.mov» в модели имени файла используется «.mov».
  2. эти файлы не имеют тега DateTimeOriginal, и я должен использовать тег MediaCreateDate, которого нет в других файлах

Кто-нибудь знает, как "заставить" exiftool использовать оригинальное расширение .mov?

Есть ли способ сказать exiftool, чтобы проверить, существует ли тег exif или нет? И использовать другой тег, если первого там нет?

Я пытался с чем-то вроде

if [ -n `exiftool -m -p '$DateTime' filename]
then
...

Но exiftool выдает мне ошибку, поэтому проверка пустой строки всегда завершается неудачей. Любой совет?

2 ответа2

6

Благодаря обратной связи с Филом Харви, разработчиком exiftool, было найдено действительно простое решение моей проблемы, которое работает с exiftool 9.30.

Фил говорит здесь (http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5079.msg24483.html#msg24483):

Последнее действительное назначение заменяет другие.

Таким образом, мы можем сделать все с помощью одной команды. Вот окончательный код:

#!/bin/bash
exiftool -P -d '%Y-%m-%d %H.%M.%S' \
    '-filename<${CreateDate}_${Model;}.%e' \
    '-filename<${DateTimeOriginal}_${Make;}.%e' \
    '-filename<${DateTimeOriginal}_${Make;}_${Model;}.%e' \
    $@

Точка с запятой это обходной путь для решения проблемы отсутствующего расширения, указанной выше (на самом деле, это произошло из-за конечных нулей в моих тегах Model).

Хорошая особенность этого подхода заключается в том, что мы не используем опцию -m , поэтому мы не будем портить, например, файлы * .mov, которые не имеют тегов exif, как большинство видео, которые можно загрузить с Сеть (они просто игнорируются).

1

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

Так как вам нужна логика, чтобы заглянуть в альтернативные теги, если один из них пуст, я предлагаю вам использовать exiftool только для извлечения необходимой информации; затем переименуйте свои файлы самостоятельно. Вот скрипт bash, который поможет вам начать с идеей, он не будет работать из коробки; это просто посмотреть, как это можно сделать :)

#!/bin/bash
# Scan the files you need
for i in *jpg *mov; do

    # Get the extension of the previous file
    extension=${i##*.}

    # Extract metadata from the file
    model=$( exiftool -f -s3 -"Model" "${i}" )
    make=$( exiftool -f -s3 -"Make" "${i}" )
    datetime=$( exiftool -f -s3 -"DateTimeOriginal" "${i}" )

    # If the datetime value is empty (returned '-' because of the '-f' option)
    # then read another tag
    if [ "${datetime}" = '-' ]; then
        datetime=$( exiftool -f -s3 -"MediaCreateDate" "${i}" )
    fi

    # Construct the new filename from the metadata gathered above
    newfilename="${datetime}-${make}-${model}.${extension}"

    # Check if the destination filename already exists, and if not,
    # create the file
    if [ ! -e "${newfilename}" ]; then
        echo mv "${i}" "${newfilename}"
    else
        echo "${i} would get renamed to ${newfilename} but that file already exists."
    fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .