Skip to content

Instantly share code, notes, and snippets.

@allencch
Created September 16, 2018 16:28
Show Gist options
  • Save allencch/e13d93667bbf977426160d7c37d76cb1 to your computer and use it in GitHub Desktop.
Save allencch/e13d93667bbf977426160d7c37d76cb1 to your computer and use it in GitHub Desktop.
Rename files according to the date
#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX 'strftime';
use File::Basename;
sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
sub get_files_from_directory {
my $path = $_[0];
opendir my $dir, $path or die "Cannot open directory: $!";
my @files = readdir($dir);
@files = grep(!/^\.$|^\.\.$/, @files);
closedir $dir;
return @files;
}
sub group_files_by_date {
my ($dir, @files) = @_;
my %groups = ();
foreach my $file (@files) {
my $timestamp = (stat "$dir/$file")[9];
my $date = strftime("%Y%m%d", localtime($timestamp));
if (not exists $groups{$date}) {
@{$groups{$date}} = ();
}
push @{$groups{$date}}, "$dir/$file";
}
return %groups;
}
sub sort_files_in_groups {
my (%groups) = @_;
foreach my $key (sort keys %groups) {
my $files = $groups{$key};
@{$groups{$key}} = sort { (stat $a)[9] <=> (stat $b)[9] } @{$files};
}
return %groups;
}
sub build_new_name {
my ($date, $num, $dir, $ext) = @_;
my $zero_num = sprintf("%02d", $num);
return "$dir${date} ${zero_num}${ext}";
}
sub name_pairs {
my (%groups) = @_;
my %pairs;
foreach my $key (keys %groups) {
my $files = $groups{$key};
for (my $i = 0; $i < scalar @{$files}; $i++) {
my $file = @{$files}[$i];
my ($basename, $dir, $ext) = fileparse($file, qr/\.[^.]*/);
my $new_name = &build_new_name($key, $i + 1, $dir, $ext);
$pairs{$file} = $new_name;
}
}
return %pairs;
}
sub print_pairs {
my (%pairs) = @_;
foreach my $key (keys %pairs) {
print "$key\t->\t$pairs{$key}\n";
}
}
sub rename_files {
my (%pairs) = @_;
foreach my $key (keys %pairs) {
rename $key, $pairs{$key};
}
}
sub save_log {
my (%pairs) = @_;
my $file = 'rename_files_to_date.log';
open(my $fh, '>', $file);
foreach my $key (keys %pairs) {
print $fh "$key\t->\t$pairs{$key}\n";
}
close $fh;
}
sub main {
my @argv = @_;
my $dir = $argv[0];
my @files = &get_files_from_directory($dir);
my %groups = &group_files_by_date($dir, @files);
%groups = &sort_files_in_groups(%groups);
my %pairs = &name_pairs(%groups);
&print_pairs(%pairs);
print "\nWARNING: Rename is irreversible. Recommend to make a backup.\n",
"Confirm rename files? (y/N) ";
my $choice = <STDIN>;
print $choice;
exit 0 unless trim($choice) eq 'y';
&rename_files(%pairs);
&save_log(%pairs);
print "Done. Log file also saved.\n";
}
&main(@ARGV);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment