#! /usr/bin/perl # exif-timestamp-adjust.pl: set timestamps on a file containing exif # data to the exif DateTimeOriginal timestamp. # Copyright (C) 2004 Nick Urbanik # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use warnings; use strict; use Image::ExifTool; use Time::Local; sub get_exif_date_text($) { my ( $filename ) = @_; my $exifTool = new Image::ExifTool; my $exif_info = $exifTool->ImageInfo( $filename ); my $datetimeoriginal = $exif_info->{DateTimeOriginal}; return $datetimeoriginal; } sub convert_exif_text_to_ctime($$) { my ( $datetimeoriginal, $name ) = @_; # Date/time-stamps are stored in EXIF files in the form # "2004:12:31 23:59:59". This regular expression will match the # date and time. if ( $datetimeoriginal !~ /(\d{4}):(\d{2}):(\d{2})\s(\d{2}):(\d{2}):(\d{2})/ ) { warn "$name: Unable to read original date/time, skipping.\n"; return; } my ( $year, $month, $day, $hour, $min, $sec ) = ( $1, $2, $3, $4, $5, $6 ); my $time = timelocal( $sec, $min, $hour, $day, $month - 1, $year - 1900 ); return $time; } sub get_exif_date_ctime($) { return convert_exif_text_to_ctime get_exif_date_text $_[0], $_[0]; } sub set_filetimestamp_to_exif_date($) { my ( $filename ) = @_; my $exiftime = get_exif_date_ctime $filename or return; my $original_time = localtime +( stat( $filename ) )[ 9 ]; my $new_time = localtime $exiftime; return if $original_time eq $new_time; unless ( utime $exiftime, $exiftime, $filename ) { warn "unable to change timestamp on $filename: $!"; return; } warn "$filename: $original_time => $new_time\n"; } foreach my $file ( @ARGV ) { set_filetimestamp_to_exif_date $file; }