Alterar a data de criação do arquivo a partir dos metadados JPEG EXIF

29

Ao fazer o upload para um site ftp, a data de criação do arquivo original parece estar perdida e, em vez disso, recebo a data de upload. No entanto, os dados Exif no arquivo estão corretos. Existe uma ferramenta para alterar em lote a data criada a partir da data Exif?

Finn Ove
fonte
11
Por favor, considere aceitar a resposta que você achar mais útil. Dessa forma, outras pessoas que pesquisarem essa pergunta a verão marcada como "respondida". É também uma maneira de recompensar uma pessoa que passou seu tempo ajudando você.
Dmitry Grigoryev

Respostas:

27

A ferramenta de manipulação EXIF exiv2possui uma opção integrada para isso:

exiv2 -T rename image.jpg

define a hora da última modificação do arquivo,, mtimepara a data armazenada nos metadados EXIF.

Você solicitou o uso do tempo de criação - mas isso não é usado em sistemas similares ao Unix - e há boas razões para isso: https://unix.stackexchange.com/questions/27297/why-doesnt-nix-keep-track do tempo de criação do arquivo

Tenho certeza de que a hora que você chama de criar tempo é realmente mtime- não há problema.


De 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.


Veja a opção -tpara fazer o oposto.

Volker Siegel
fonte
Eu interpretaria "oposto" para definir o timestamp EXIF ​​a partir do timestamp do arquivo, mas não é isso que -tacontece. De fato, parece realmente fazer um superconjunto do que -Tfaz.
Michael
7

Se você instalar o exiftool a partir do CPAN, poderá executar o seguinte script, assumindo que todos os seus arquivos estejam em um diretório chamado "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
Joel Taylor
fonte
você pode descrever o que esse script está fazendo? Em particular os argumentos paraexiftool
user5359531 15/10
5

Supondo, como mencionado por 'Volker Siegel', que você provavelmente quis dizer mtime, eu usaria simplesmente a função embutida do exiftools.

gostar:

 $ exiftool "-DateTimeOriginal>FileModifyDate" test.jpg

isso pegará as informações "campo exif" DateTimeOriginal "e as usará para definir as informações de data / hora modificadas pelo sistema de arquivos do arquivo" test.jpg ".

Exemplo:

$ 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
fonte
4

Também pode ser feito usando o jheadcomando:

$ jhead -ft file.jpg
SkyRaT
fonte
Para o Jhead 3.0, a opção é -dsft. -ftfaz o oposto.
Tesquin Crydd
O jhead parece ser a única ferramenta EXIF ​​que não mexe com o cabeçalho EXIF ​​- exiftool e exiv2 aumentam o tamanho do arquivo e movem os cabeçalhos, o que é totalmente inaceitável para mim.
Michael
3

O ExifTool pode ler e manipular a maioria das informações EXIF, incluindo a extração das tags Date / Time Original ou Create Data EXIF. Você pode usar essas informações para renomear os arquivos ou alterar seus carimbos de data e hora. Por exemplo:

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

Ele encontrará todos os arquivos JPG no diretório atual e atualizará os carimbos de data e hora.

Se você quiser também dar um nome a esses arquivos com base nessa data (isso costuma ser útil), adicione também mv -i $PIC $(dirname $PIC)/$DATE.jpgantes da donelinha.

krowe
fonte