You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.4 KiB
116 lines
2.4 KiB
#!/usr/bin/perl
|
|
|
|
my $help = <<'END_HELP';
|
|
File Renamer
|
|
usage: renamer.pl DIR SEARCHREGEX REPLACEREGEX [--doit]
|
|
|
|
for every regular file in DIR, sorted by mtime,
|
|
replaces the SEARCHREGEX with REPLACEREGEX in every filename.
|
|
if the new name clashes with an already existing file, a count
|
|
will be appended before the first dot.
|
|
Does NOT rename anything unless --doit
|
|
|
|
Special Variables are:
|
|
%NR% - the index number for the file with the current sorting
|
|
%MTIME% - the modification time of the file
|
|
|
|
no captures support in regex :(
|
|
END_HELP
|
|
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Data::Dumper;
|
|
use POSIX qw(strftime);
|
|
use Cwd;
|
|
use File::stat;
|
|
|
|
# print(Dumper(@ARGV) . "\n");
|
|
# print("size:" . int(@ARGV) . "\n");
|
|
|
|
if (int(@ARGV) < 3) {
|
|
usage();
|
|
}
|
|
|
|
my $dir = $ARGV[0];
|
|
my $regexSearch = $ARGV[1];
|
|
my $regexReplace = $ARGV[2];
|
|
my $reallyDoIt = $ARGV[3] || 0;
|
|
|
|
if (!-d $dir) {
|
|
print("$dir - no such dir" . "\n");
|
|
exit(-1);
|
|
}
|
|
|
|
if ($reallyDoIt eq "--doit") {
|
|
$reallyDoIt = 1;
|
|
} else {
|
|
print("Dry run. Not renaming anything." . "\n");
|
|
}
|
|
|
|
chdir($dir) || die "FATAL: cant chdir";
|
|
|
|
opendir(DIR, getcwd());
|
|
my @files = readdir(DIR);
|
|
closedir(DIR);
|
|
|
|
#filter out dirs
|
|
my @filesNoDir;
|
|
foreach (@files) {
|
|
if (!-d $_) {
|
|
push(@filesNoDir, $_);
|
|
}
|
|
}
|
|
|
|
@files = @filesNoDir;
|
|
|
|
my @sorted_files = sort {stat($a)->mtime <=> stat($b)->mtime} @files;
|
|
|
|
my $fname = "";
|
|
my $fstat = "";
|
|
my $mtime_display = "";
|
|
my $mtime_filename = "";
|
|
|
|
my $fname_new = "";
|
|
my $counter = 1;
|
|
my $regexReplaceNew = "";
|
|
my $counterFmt;
|
|
for (@sorted_files) {
|
|
$fname = $_;
|
|
$fstat = stat($_);
|
|
$mtime_display = strftime('%Y/%m/%d %H:%M:%S', localtime($fstat->mtime));
|
|
$mtime_filename = strftime('%y%m%d_%H%M%S', localtime($fstat->mtime));
|
|
|
|
$regexReplaceNew = $regexReplace;
|
|
$counterFmt = sprintf("%03s", $counter);
|
|
$regexReplaceNew =~ s/%NR%/$counterFmt/g;
|
|
$regexReplaceNew =~ s/%MTIME%/$mtime_filename/g;
|
|
|
|
$fname_new = $fname;
|
|
$fname_new =~ s/$regexSearch/$regexReplaceNew/;
|
|
# $fname_new =~ s/(.*?)\s1-/%NR%_$1/;
|
|
|
|
my $fname_result = $fname_new;
|
|
|
|
my $count_clash = 0;
|
|
while(-e $fname_result) {
|
|
my $count_clash_fmt = sprintf("%02s", $count_clash);
|
|
$fname_result = $fname_new =~ s/(.*?)\./$1_$count_clash_fmt./r;
|
|
$count_clash++;
|
|
}
|
|
|
|
printf "%-60s%-60s%-20s\n", $fname_result, $fname, $mtime_display;
|
|
if ($reallyDoIt) {
|
|
rename($fname, $fname_result);
|
|
}
|
|
|
|
$counter++;
|
|
}
|
|
|
|
|
|
|
|
sub usage {
|
|
print $help;
|
|
die "\n";
|
|
}
|
|
|