Изменить дату создания файла из метаданных JPEG EXIF

29

При загрузке на FTP-сайт первоначальная дата создания файла, похоже, теряется, и вместо этого я получаю дату загрузки. Однако данные Exif в файле верны. Есть ли инструмент для пакетного изменения даты создания с даты Exif?

Финн Ове
источник
1
Пожалуйста, подумайте о том, чтобы принять ответ, который вы считаете наиболее полезным. Таким образом, другие люди, которые ищут этот вопрос, увидят его помеченным как «отвеченный». Это также способ вознаградить человека, который потратил свое время, помогая вам.
Дмитрий Григорьев

Ответы:

27

Инструмент обработки EXIF exiv2имеет встроенную опцию для этого:

exiv2 -T rename image.jpg

устанавливает время последней модификации файла, mtimeна дату, сохраненную в метаданных EXIF.

Вы просили использовать время создания, но оно не используется в Unix-подобных системах, и для этого есть веские причины: /unix/27297/why-doesnt-nix-keep-track -of-файлов создание времени

Я уверен, что время, которое вы называете временем создания, на самом деле mtime- без проблем.


От man exiv2:

NAME
        exiv2 - Image metadata manipulation tool

 SYNOPSIS
        exiv2 [options] [action] file ...

 DESCRIPTION
        exiv2 is a program to read and write Exif, IPTC and XMP image metadata and image com‐
        ments. The following image formats are supported:

 [ ... ]

 mv | rename
       Rename files and/or set file timestamps according to the Exif create time‐
       stamp.  Uses  the  value  of  tag  Exif.Photo.DateTimeOriginal  or, if not
       present, Exif.Image.DateTime to determine the timestamp. The filename for‐
       mat can be set with -r fmt, timestamp options are -t and -T.

 [ ... ]

 -T     Only  set  the  file  timestamp according to the Exif create timestamp, do not
        rename the file (overrides -k). This option is only  used  with  the  'rename'
        action.  Note:  On Windows you may have to set the TZ environment variable for
        this option to work correctly.


Смотрите опцию, -tчтобы сделать обратное.

Volker Siegel
источник
Я бы интерпретировал «противоположное», чтобы означать установку временной метки EXIF ​​из временной метки файла, но это не то, что -tделает. На самом деле, кажется, что на самом деле делает супер-набор того, что -Tделает.
Майкл
7

Если вы устанавливаете exiftool из CPAN, вы можете запустить следующий скрипт, предполагая, что все ваши файлы находятся в каталоге с именем «all».

#!/bin/sh
for i in all/*; do
    SPEC=`exiftool -t -s -d "%Y-%m-%d %H:%M:%S" -CreateDate "$i"`
    read X DATE <<<${SPEC}
    echo "$i:$DATE"
    touch -d "$DATE" "$i"
done
Джоэл Тейлор
источник
Можете ли вы описать, что делает этот скрипт? В частности, аргументы дляexiftool
user5359531
5

Предполагая, что, как упоминает Volker Siegel, вы, вероятно, имеете в виду mtime, я просто использовал бы встроенную функцию exiftools.

нравится:

 $ exiftool "-DateTimeOriginal>FileModifyDate" test.jpg

это возьмет информацию «поле exif« DateTimeOriginal »и использует ее для установки информации о дате / времени изменения файловой системы файла« test.jpg ».

Пример:

$ ls -la test.jpg
-rw-r-----@ 1 user  18329968  2432451 14 Out 17:57 test.jpg

$ exiftool -DateTimeOriginal test.jpg
Date/Time Original              : 2015:10:09 13:29:58

$ exiftool "-DateTimeOriginal>FileModifyDate" test.jpg
    1 image files updated

$ ls -la test.jpg
-rw-r-----@ 1 user  18329968  2432451  9 Out 13:29 test.jpg
6ugr3
источник
4

Это также можно сделать с помощью jheadкоманды:

$ jhead -ft file.jpg
SkyRaT
источник
Для Jhead 3.0 опция есть -dsft. -ftделает обратное.
Tesquin Crydd
Кажется, jhead - единственный инструмент EXIF, который не портит заголовок EXIF ​​- exiftool и exiv2 фактически увеличивают размер файла и перемещают заголовки, что совершенно неприемлемо для меня.
Майкл
3

ExifTool может читать и манипулировать большей частью информации EXIF, включая извлечение оригиналов даты / времени или тэгов EXIF ​​Create Data. Вы можете использовать эту информацию для переименования файлов или изменения их отметок времени. Например:

find -name '*.jpg' | while read PIC; do
    DATE=$(exiftool -p '$DateTimeOriginal' $PIC |
    sed 's/[: ]//g')
    touch -t $(echo $DATE | sed 's/\(..$\)/\.\1/') $PIC
done

Это позволит найти все файлы JPG в текущем каталоге и обновить временные метки.

Если вы также хотите присвоить этим файлам имя на основе этой даты (это может пригодиться), добавьте также mv -i $PIC $(dirname $PIC)/$DATE.jpgперед doneстрокой.

krowe
источник