My camera produces JPG files that have date and time information in the file name. I want to move the files to new subdirectories per year, month and day.
IMG_20150723_233831.jpg -> 2015/07/23/IMG_20150723_233831.jpg
IMG_20151001_174215.jpg -> 2015/10/01/IMG_20151001_174215.jpg
I wrote this small perl script to perform this task:
#!/usr/bin/perl
# Move files to new subdirectories based on file name.
# CC BY SA 2015, Lieven Blancke
# my camera produces JPG files named IMG_yyyymmdd_nnnnnn.jpg
# I want to move these files to subdirectory per year, month and day
# IMG_20150723_233831.jpg -> 2015/07/23/IMG_20150723_233831.jpg
# IMG_20151001_174215.jpg -> 2015/10/01/IMG_20151001_174215.jpg
use strict;
use warnings;
use File::Copy;
use File::Path 'make_path';
my $directory = './';
opendir (DIR, $directory) or die $!;
while(my $file = readdir (DIR)) {
# ignore files beginning with a period
next if ($file =~ m/^\./);
# only files, no directories
next unless (-f "$file");
# only process files like IMG_yyyymmdd_nnnnnn.jpg
if ($file =~ /^IMG_([0-9]{4})([0-9]{2})([0-9]{2})_([0-9]{6})\.jpg$/) {
print "$file -> $1/$2/$3/$file\n";
# create the directory $1, $1/$2 and $1/$2/$3 in one go
make_path("$1/$2/$3");
# move the file to the directory
move($file,"$1/$2/$3/$file") or die "Could not move file $1 to directory /$2/$3: $!";
}
}
closedir(DIR);