Переименовать файл в зависимости от того, какой тег содержит самую раннюю или самую старую дату? - Фотопедия
0 голосов
/ 23 декабря 2014

Я использую следующую команду для массового переименования изображений внутри скрипта 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?

1 Ответ

1 голос
/ 24 декабря 2014

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

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

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

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...