Usando EXIFTool para adicionar dados EXIF ​​de nomes de arquivos

Usando EXIFTool para adicionar dados EXIF ​​de nomes de arquivos

Há um conjunto de fotos com carimbos de data e hora em seus nomes de arquivos como estes:

Photo on 3-09-12 at 9.24 PM #2.jpg

Photo on 3-09-12 at 9.24 PM #1.jpg

Photo on 3-09-12 at 8.23 PM.jpg

etc.

("3-09-12", significa "3 de setembro de 2012" ou DD-MM-AA)

Mas essas fotos não possuem nenhum dado EXIF. Antes de importá-los para uma coleção maior, como você canalizaria essas informações exiftoole também solicitaria que adicionasse novos carimbos de data e hora como dados EXIF, todos a partir dos nomes dos arquivos das fotos?

Atualizar: (A agora parte 1 de) minha pergunta sobre a análise de nomes de arquivos com DD-MM-AA e 12 horas foi gentilmente respondida por @Stephane. Mas descobri que o mesmo lote de fotos contém nomes de arquivos com uma variação que esqueci. Espero que faça mais sentido adicionar um 'Pt. 2' em vez de iniciar uma questão totalmente nova.

Resumidamente:

Como eu poderia mudar a resposta brilhante de @Stephane -

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*?at.*?[AP]M)/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*[PA]M*.jpg

- para que funcione com o formato de nome de arquivo abaixo, que é um pouco diferente da primeira parte da pergunta, pois usa AAAA-MM-DD e horário de 24 horas:

Photo on 2010-09-15 at 18.44 #4.jpg

Photo on 2010-09-15 at 18.44 #3.jpg

Photo on 2010-09-15 at 18.44.jpg

Mais explicação:

Tentar editar a Date::Manipparte do roteiro de Stephane parece mostrar minha ignorância sobre o que está acontecendo nas partes mais importantes dele.

Tentei omitir a Date_Initlinha, já que voltamos ao formato de data de ano inteiro no estilo ISO e depois tivemos

/on (.*?at.*?)/;$_=$1;
y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
' ./*on\ *at*.jpg

Mas exiftoolestá me dando no writeable tagse FileName not defined. Instruções emhttp://search.cpan.org/~sbeck/Date-Manip-5.56/lib/Date/Manip.podnão parecem ser úteis (pelo menos para mim) para entender o que está acontecendo com esses pontos, aquele 'y' no início da linha, ponto e vírgula etc., e eles são bastante impossíveis de serem pesquisados ​​no Google: S

Responder1

Tentar:

exiftool '-CreateDate<${FileName;use Date::Manip;
                      Date_Init("DateFormat=non-US");
                      /on (.*at.*?)(?: #\d+)?\.jpg$/;$_=$1;
                      y/./:/;$_=UnixDate($_,"%Y-%m-%d %T")
                      }' ./*on\ *at*.jpg

(talvez seja necessário instalar o Date::Manip perlmódulo).

O -Tag<valuedefine a tag correspondente. O ${tag;perl-code}pode ser usado para expandir para o valor de tagdepois de ter sido processado pelo perl-code.

Aqui, o plano é usar a função Date::Manipde UnixDatepara analisar a data no nome do arquivo e convertê-la para um formato aceitável para a CreateDatetag ( 2011-04-15 21:38:00).

Date::Manipentende muitos formatos de data comuns. Por exemplo, ele entende 3-09-12 at 9:24 PM(embora você precise dizer se é a convenção dos EUA ou de fora dos EUA, onde o dia ou mês é o primeiro) e 2010-09-15 at 18.44(observe o :em vez de .).

Então o que fazemos é extrair essa parte do nome do arquivo, converter .para :e passá-la para UnixDate.

informação relacionada