Как установить DateTimeOriginal файла из имени файла, используя ExifTool

У меня есть каталог со многими файлами изображений, для которых не установлены метаданные DateTimeOriginal, но эта дата содержится в самом имени файла в формате YYYMMDDнапример, 20120524_091536.mp4

Я хочу использовать exiftool для перемещения этих файлов в папки с годом, а затем в подпапки месяца (затем позже также установите его DateTimeOriginal, используя эту дату из имени файла).

Что-то вроде этого:

exiftool -d "%Y-%m-%d" "-testname<D:\Pictures\${filename#;DateFmt('%Y')}\${filename#;DateFmt('%m')}\$FileName" "D:\Pictures\2012-05-24" -r 

Но это дает Error converting date/time for 'filename' ошибка. Что имеет смысл, как мне сказать отформатировать только первые 8 цифр имени файла к дате?

Причина, по которой я хочу использовать ExifTool для этого, заключается в том, что я собираюсь еще больше уточнить это утверждение, чтобы сделать это только для файлов, которые еще не имеют datetimeoriginal набор метаданных, поэтому exiftool может отфильтровать их... что-то вроде этого классификатора:

exiftool '-datetimeoriginal<filemodifydate' -if '(not $datetimeoriginal or ($datetimeoriginal eq "0000:00:00 00:00:00")) and ($filetype eq "JPEG")'

Но вместо установки datetimeoriginal для filemodifydate мне нужно установить для него дату, отформатированную из имени файла.

1 ответ

Решение

Установить DateTimeOriginal из имени файла, команда так же просто, как
exiftool "-DateTimeOriginal<Filename" -if "not $datetimeoriginal or ($datetimeoriginal eq '0000:00:00 00:00:00')" -ext jpg DIR

Это основано на часто задаваемых вопросах Exiftool #5, в которых говорится, что "ExifTool очень гибок в отношении фактического формата вводимых значений даты / времени при записи и будет пытаться переформатировать любые значения в стандартный формат, если не используется опция -n. Любые разделители могут использоваться (или фактически вообще не использовать). Первые 4 последовательные цифры, найденные в значении, интерпретируются как год, затем следующие 2 цифры - месяц и т. д. "

Я удалил $filetype eq "JPEG" часть вашего примера и заменил его с опцией -ext для проверки Filetype плохой способ ограничения обрабатываемых файлов, так как exiftool все равно будет обрабатывать и извлекать все метаданные из каждого файла для выполнения проверки.

Обратите внимание, что тип файла.mp4, как показано в вашем примере, не может содержать DateTimeOriginal тег. Вместо этого вам придется использовать что-то вроде CreateDate, Также обратите внимание, что exiftool имеет ограниченную возможность записи в видеофайлы.

Поскольку имя файла не является тегом типа timestamp, вы не можете использовать опцию -d (dateformat), как вы обнаружили. Вместо этого вам придется использовать функцию расширенного форматирования, чтобы разделить имя файла. Учитывая первый пример имени файла, ваша команда будет:

exiftool "-testname<D:\Pictures\${filename;s/^(\d{4}).*/$1/}\${filename;s/^\d{4}(\d\d).*/$1/}\%F" "D:\Pictures\2012-05-24" -r

-d "%Y-%m-%d" часть удалена, так как она не использовалась в вашем примере. ${filename;s/^(\d{4}).*/$1/} использует регулярное выражение для сопоставления первых четырех цифр имени файла и удаления остальных. ${filename;s/^\d{4}(\d\d).*/$1/} удаляет первые четыре цифры, сопоставляет следующие две и удаляет оставшуюся часть имени файла. %F переменная exiftool для имени файла +ext, используемая для различных файловых операций exiftool, таких как переименование и перемещение (но недоступно при обработке тегов).

Другие вопросы по тегам