Программное обеспечение для поиска фотографий в формате JPEG (JPG), временная метка измененного файла которых не соответствует сохраненным данным Exif.

Недавно я обнаружил, что временные метки модификации файлов на некоторых моих фотографиях (хранящихся в виде файлов JPG/JPEG) не совпадают с временными метками, хранящимися в их данных Exif. Это странно, потому что я никогда не модифицировал ни одну из этих фотографий.

Я хочу найти другие фотографии, на которых это произошло, чтобы, возможно, определить причину и предотвратить это в будущем.

Чтобы помочь мне в этом, пожалуйста, порекомендуйте программное обеспечение, которое может сравнивать временные метки модификации файла пакета (~ 50 000) файлов JPG с любыми временными метками Exif, хранящимися внутри них. Я предпочитаю, чтобы программное обеспечение использовало время захвата (также известное как исходное время ), но оно может использовать любое из полей временной метки Exif.

Единственным другим требованием является совместимость программного обеспечения с Windows.

Предпочтительно переносимое бесплатное программное обеспечение с открытым исходным кодом, но ни одно из них не является обязательным.

Многие утилиты и приложения для копирования файлов не сохраняют метки времени или предоставляют необязательные аргументы для сохранения.
@IrfanLatif Спасибо, Ирфан. Определенно верно. Странно то, что я намеренно выбираю те, которые делают. После того, как я выясню, какие файлы задействованы, возможно, я лучше пойму, что произошло. Я думаю, может быть, это была конкретная версия приложения с регрессией, которая теперь исправлена.

Ответы (1)

Я любитель CLI, поэтому предложил бы, exiv2что с открытым исходным кодом и кросс-платформенный. Для работы следующего простого сценария оболочки все, что вам нужно, это exiv2и, необязательно (для awkи sed) busybox, двоичный файл (оба переносимы, установка не требуется). Я использую его на Android и Linux. В Windows вы можете использовать Cygwin или WSL (или даже написать .batскрипт, я в этом не силен):

#!/bin/sh

DIR='/sdcard/DCIM'

find $DIR -type f -iname '*.jp*g' |
while read -r photo
do
    exif_ts=$(exiv2 -q pr "$photo" 2>/dev/null | busybox awk '/timestamp/ {print $4}' | busybox sed 's|:|-|g')
    fs_ts=$(busybox stat -c %y "$photo" | busybox awk '{print $1}')

    [ "$exif_ts" = "$fs_ts" ] || printf '%-12s%-12s%s\n' "$exif_ts" "$fs_ts" "$photo"
done

Это выведет все файлы, временные метки которых отличаются:

...
2017-02-20  2018-12-01  /sdcard/DCIM/Camera/20170220_145017.jpg
            2017-08-15  /sdcard/DCIM/Camera/20170614171823.jpg
2016-12-30  2019-01-07  /sdcard/DCIM/Camera/FB_IMG_1483082415875.jpg
...

Первый столбец — это временная метка EXIF, а второй — временная метка файловой системы. Вы также можете получить часы, минуты и секунды в обеих метках времени.

Это выглядит великолепно. Спасибо. Я должен был упомянуть, что задействовано более 50 000 фотографий. Любая идея, как адаптировать его для обработки такого количества файлов? Кроме того, я пытаюсь выяснить, как разрешить вашему коду учитывать незначительные различия в 1 час из-за перехода на летнее время, которое может пересекать границу даты.
50000 - не большое число для компьютерного процессора. На моем Android 2500+ фотографии заняли 35 секунд. На ПК это должно быть намного лучше.
Да. Я думал о времени, потраченном вручную на чтение вывода. Когда я написал этот комментарий, я очень устал и не полностью обработал "$exif_ts" = "$fs_ts", что минимизирует эту проблему.