Pixdate


Change image file names to their creation date, in YYMMDD format.
Before:
After:



Note that YYMMDD format means that alphabetical order is the same as chronological order (except over a change of  millenium).



Download .app (just drop a folder on it in the finder).

Download code.


Here's the code itself:

#!/usr/bin/perl -w
use strict;
use File::stat;
use Time::localtime;

my $dir = shift @ARGV;

unless($dir) { my $man= <<'HERE';
----------------------------------------------------------
USAGE:  pixdate <directory>

Changes .jpg and .mov filenames to file creation date in YYMMDD format.

Example: DSCN1009.JPG => 080902_01.jpg

----------------------------------------------------------
HERE
           print $man;
           exit;
         }

my %months = (Jan=>'01',Feb=>'02',Mar=>'03',Apr=>'04',May=>'05',Jun=>'06',
          Jul=>'07',Aug=>'08',Sep=>'09',Oct=>'10',Nov=>'11',Dec=>'12');

(!-e $dir)  and die "No such directory as $dir";
opendir(DIR, $dir) or die $!;
my @names = grep({/\.jpe?g$/i || /\.mov$/i} readdir(DIR));
closedir(DIR);

my (%dates,%newname); #dates is date=>[fn1,fn2,..]; $newname is name=>newname
for my $name (@names) {
  my $time = ctime(stat("$dir/$name")->mtime());
  my($mo,$day,$yr) = ($time =~ /\w\w\w\s(\w\w\w)\s([\s\d]\d+).*\d\d(\d\d)$/);
  $mo = $months{$mo};
  $day =~ /\s(\d)/ and $day="0$1";
  my $ext  = ($name=~/\.jpe?g$/i ? "jpg" : "mov");
  my $date = "$yr$mo$day";
  push @{$dates{$date}},$name;
  my $num = 0+@{$dates{$date}};
  $num=~ /^(\d)$/ and $num="0$1";
  my $newname = $date.'_'.$num.".$ext";
  $newname{$name}=$newname;
}

for my $date (keys(%dates)) {
  if (@{$dates{$date}}==1) {
    my $name = (@{$dates{$date}})[0];
    rename "$dir/$name","$dir/$newname{$name}";
  } else {
    mkdir "$dir/$date";
    map {rename "$dir/$_","$dir/$date/$newname{$_}"} @{$dates{$date}};
  }
}

exit;