Я использую следующую команду для массового переименования изображений внутри скрипта 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?
Я добавил необходимые шаги здесь:
https://github.com/pratyushtewari/exif-scripts/blob/master/README.md
Сохраните файл old_datetime_config в домашней папке C:\Users\YOURUSERNAME
, или в своем домашнем каталоге ~
, или в той же папке, где вы установили exiftool. Этот шаг важен для успешного выполнения следующих шагов. Переименуйте файл в.ExifTool_config
Вы можете найти их в скрипте здесь, но я обнаружил, что выполнение команд в папке pic, которую я упомянул в приведенных ниже параметрах, намного быстрее, чем их выполнение через скрипт python exif-scripts/setToOldestDate.py. Для более быстрой обработки вы можете запустить эти команды прямо в powershell из папки pic, которую вы планируете.
Если вы используете WSL, запустите эти команды из poweshell, а не из WSL, так как файловая система для чтения и записи из виртуализации Windows взорвет вашу оперативную память и замедлит процесс до полной остановки.
🦺 Обратите внимание, что эти скрипты рекурсивны и хорошо повлияют на все подпапки.
Ну… теперь — выбирайте варианты:
Это довольно гибкий и нечеткий синтаксический анализатор от exiftool, но если вы хотите, чтобы он был абсолютно уверен, вы можете изменить файл, чтобы включить yyyymmdd_hhmmss и удалить все остальные числа перед ним (после этого все в порядке).
exiftool "-FileModifyDate<filename" −overwrite_original -S -m -progress -ee -q -q ./
exiftool -overwrite_original "-FileModifyDate<OldestDateTime" "-ModifyDate<OldestDateTime" "-DateTimeOriginal<OldestDateTime" "-CreateDate<OldestDateTime" "-GPSDateTime<OldestDateTime" -S -m -progress -ee -q -q ./
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, чтобы Google Photos знал, какие новые файлы необходимо создавать резервные копии. В настоящее время он не всегда обнаруживает автоматически, так зачем ждать этого. Установите Refresh MediaStore и запустите его после завершения загрузки adb с телефона. Затем вы можете открыть Google Фото и увидеть, что резервное копирование начинается.
.ExifTool_config
Вы должны быть в состоянии сделать еще несколько сумасшедших выражений Perl внутри этих {}. (На самом деле у меня было бы больше соблазна написать что-то такое сложное на другом языке, но ради аргумента):
${CreateDate; use Date::Parse; @vals = strptime($_); sprintf("%-04d_%-02d_...", $vals[5], $vals[4]);}
Примечание: полностью непроверенный код. Я сомневаюсь, что это работает. Но это дает вам направление для начала, если вы знаете perl.
МайкВ
JDługosz
Ромео Нинов
аксиопистика