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;