Переименовать файл на основе тега, содержащего самую раннюю или самую старую дату?

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

exiftool -r -f '-filename<${CreateDate}_${model;tr/ /_/}_%f.jpg' -d %Y%m%d_T%H%M%S%%-c -ext jpg $targetDir

Иногда, чаще, чем хотелось бы, я сталкиваюсь с изображениями, у которых в метаданных указаны неверные значения дат. Например:

$ exiftool -*date -G -s  *.jpg
[File]          FileModifyDate                  : 2014:12:22 18:32:03-07:00
[File]          FileAccessDate                  : 2014:12:23 11:41:23-07:00
[File]          FileInodeChangeDate             : 2014:12:23 11:40:00-07:00
[EXIF]          CreateDate                      : 2014/12/23 00:52:41

В этом примере FileModifyDate — это дата, которую я ожидал увидеть в теге CreateDate, то есть снимок был сделан в 2014:12:22 18:32:03-07:00.

Но поскольку CreateDate неверен, новое имя файла неверно. Что ж, с точки зрения команды, используемой для переименования файла, это правильно (мусор на входе -> мусор на выходе), но я бы хотел, чтобы дата, используемая в имени файла, была датой/временем, когда снимок был фактически сделан.

В этом примере есть ли способ запросить файл для всех тегов даты, а затем выбрать самую раннюю доступную дату в качестве даты для использования в переименованном имени файла?

Кроме того, используя '${model;tr/ /_/}', я могу заменить любые пробелы, которые могут быть в теге модели, символами подчеркивания. Это хорошо, но я бы предпочел обернуть это выражение вокруг всего нового имени файла. Таким образом, поскольку я использую «%f.jpg», если исходное имя файла содержало какие-либо пробелы, результирующее имя файла не содержало бы пробелов. Возможно ли это с exiftool?

Я подозреваю, что вы, скорее всего, получите помощь здесь: superuser.com/questions/tagged/exiftool
Я также получаю проблему, что дата exif отключена на постоянную величину для всех файлов. Вы можете выяснить смещение, а затем получить правильное время для всего набора. В конце концов, камера не будет ставить разное время для каждого снимка; часы будут установлены неправильно.
Или, может быть, часовой пояс компьютера или камеры не установлен должным образом
Как перенести вопрос с одного сайта на другой, не дублируя его?

Ответы (2)

Я добавил необходимые шаги здесь:

https://github.com/pratyushtewari/exif-scripts/blob/master/README.md

Установите самую старую дату из метаданных Exif или имени файла

Шаг 0 - установите exiftool снизу

Установка ExifTool

👉 Шаг 0.1

Сохраните файл old_datetime_config в домашней папке C:\Users\YOURUSERNAME, или в своем домашнем каталоге ~, или в той же папке, где вы установили exiftool. Этот шаг важен для успешного выполнения следующих шагов. Переименуйте файл в.ExifTool_config

Вы можете найти их в скрипте здесь, но я обнаружил, что выполнение команд в папке pic, которую я упомянул в приведенных ниже параметрах, намного быстрее, чем их выполнение через скрипт python exif-scripts/setToOldestDate.py. Для более быстрой обработки вы можете запустить эти команды прямо в powershell из папки pic, которую вы планируете.

Если вы используете WSL, запустите эти команды из poweshell, а не из WSL, так как файловая система для чтения и записи из виртуализации Windows взорвет вашу оперативную память и замедлит процесс до полной остановки.

🦺 Обратите внимание, что эти скрипты рекурсивны и хорошо повлияют на все подпапки.

Ну… теперь — выбирайте варианты:

Вариант 1 - В случае, если вам нужно выбрать дату из имени файла.

Это довольно гибкий и нечеткий синтаксический анализатор от exiftool, но если вы хотите, чтобы он был абсолютно уверен, вы можете изменить файл, чтобы включить yyyymmdd_hhmmss и удалить все остальные числа перед ним (после этого все в порядке).

exiftool "-FileModifyDate<filename" −overwrite_original -S -m -progress -ee -q -q ./

Вариант 2 - установить все даты на самую старую дату

exiftool -overwrite_original "-FileModifyDate<OldestDateTime" "-ModifyDate<OldestDateTime" "-DateTimeOriginal<OldestDateTime" "-CreateDate<OldestDateTime" "-GPSDateTime<OldestDateTime" -S -m -progress -ee -q -q ./

Вариант 3 — установить имя файла в формате PXL_ггггммдд_ччммсс-[число-если-конфликт].расширение

exiftool "-filename<OldestDateTime" -d PXL_%Y%m%d_%H%M%S%%-c.%%e -S -m -ee -progress -q -q ./

чтобы нажать все файлы в текущем каталоге, используйте

adb push -a . /sdcard/DCIM/Camera/

-a для сохранения атрибутов.

⌛ Обновить Android Media Store**

В качестве последнего шага вам необходимо обновить базу данных хранилища мультимедиа Android, чтобы Google Photos знал, какие новые файлы необходимо создавать резервные копии. В настоящее время он не всегда обнаруживает автоматически, так зачем ждать этого. Установите Refresh MediaStore и запустите его после завершения загрузки adb с телефона. Затем вы можете открыть Google Фото и увидеть, что резервное копирование начинается.

Спасибо! Один важный шаг, который я упустил из виду, — назвать сценарий exif как.ExifTool_config
О, да. Я не оставил имя с точкой, потому что в тот момент, когда вы загружали его, оно было скрыто, и люди продолжали его искать. ржу не могу. Я добавлю это в сам ридми.

Вы должны быть в состоянии сделать еще несколько сумасшедших выражений Perl внутри этих {}. (На самом деле у меня было бы больше соблазна написать что-то такое сложное на другом языке, но ради аргумента):

${CreateDate; use Date::Parse; @vals = strptime($_); sprintf("%-04d_%-02d_...", $vals[5], $vals[4]);}

Примечание: полностью непроверенный код. Я сомневаюсь, что это работает. Но это дает вам направление для начала, если вы знаете perl.

+1, потому что, да, что-то в этом роде. :) А также указатель на то, что может быть лучшим подходом: привязки python gexiv2