Как установить 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, мне нужно установить его на дату, отформатированную на основе имени файла.


person crichavin    schedule 20.12.2018    source источник


Ответы (1)


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

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

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

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

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

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, таких как переименование и перемещение (но недоступна при обработке тегов).

person StarGeek    schedule 20.12.2018
comment
Спасибо! Это работает отлично, но теперь нашел другой сценарий. У меня есть некоторые файлы, отформатированные как YYYYMMDD_xxxxx.avi, а некоторые - YYYY-MM-DD_xxxxx.avi, где xxxxx - какой-то случайный номер. Это форматирование регулярного выражения приводит к следующему: 'D:/Pictures/2012-05-24/2009-01-07 114.avi' --> 'D:/Pictures/2009/2009-01-07 114.avi/2009-01-07 114.avi'. Я знаю, что могу изменить регулярное выражение, чтобы правильно отформатировать каждый сценарий, но как вы можете условно переименовать только те имена файлов, которые соответствуют формату YYYYMMDD_xxxxx.avi, используя регулярное выражение, которое вы указали, но игнорировать другие файлы с дефисами? - person crichavin; 20.12.2018
comment
Функция -if не показывает, что она исключает регулярное выражение: owl .phy.queensu.ca / ~ phil / exiftool / - person crichavin; 20.12.2018
comment
Параметр if позволяет использовать логическое выражение, подобное Perl, поэтому вы можете использовать оператор привязки Perl следующим образом: `-if $ filename = ~ / ^ \ d {8} _ \ d {6} / для сопоставления только файлов с шаблоном 8digitsUnderscore6Digits . - person StarGeek; 20.12.2018