exif-date.pl


   1 #!/usr/bin/env perl 
   2 use strict;
   3 $|++;
   4 
   5 use Image::ExifTool qw(ImageInfo);
   6 
   7 use Time::Local;
   8 
   9 for my $file (@ARGV) {
  10     my $ii = ImageInfo( $file, qw(DateTimeOriginal DateTime) )
  11       or warn("Skipping $file\n"), next;
  12     my ($created) =
  13       grep /\S/, @$ii{qw(DateTimeOriginal DateTime)};
  14     next unless $created;
  15     warn "using $created for $file\n";
  16     if ( $created =~ s/([-+ ])(\d\d):(\d\d)$// ) {
  17         my ( $sign, $hour, $minute ) = ( $1, $2, $3 );
  18 
  19         # warn "ignoring offset of $sign $hour:$minute\n";
  20     }
  21     my @digits = $created =~ /(\d+)/g or next;
  22     if ( $digits[0] < 1900 ) {
  23         warn "bad year $digits[0] for $file";
  24         next;
  25     }
  26     $digits[0] -= 1900;
  27     $digits[1] -= 1;
  28     my $gmtime = timegm( reverse @digits );
  29     if ( $gmtime > time or $gmtime < time - 86400 * 90 ) {
  30         warn "preposterous gmtime for $file: ", scalar gmtime $gmtime;
  31 
  32         # next;
  33     }
  34     utime( $gmtime, $gmtime, $file ) or warn "Cannot utime on $file: $!";
  35 }