Created
September 16, 2018 16:28
-
-
Save allencch/e13d93667bbf977426160d7c37d76cb1 to your computer and use it in GitHub Desktop.
Rename files according to the date
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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