#!/usr/bin/perl my $help = <<'END_HELP'; Sampling tool 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. Does NOT rename anything unless DOIT! Special Variables are: %NR% - the index number for the file with the current sorting no captures support in regex :( END_HELP use strict; use warnings; use Data::Dumper qw(Dumper); use POSIX qw(strftime); use Cwd; use File::stat; my $dir = "-?"; $dir = $ARGV[0]; my $regexSearch = $ARGV[1]; my $regexReplace = $ARGV[2]; my $reallyDoIt = $ARGV[3]; if ($dir eq "-?") { usage(); } if(!$dir) { print "Error: Need a directory.\n"; die "\n"; } if(!$regexSearch) { print "Error: Need a search regex.\n"; die "\n"; } if(!$regexReplace) { print "Error: Need a replace regex.\n\n"; die "\n"; } chdir($dir) || die "FATAL: cant chdir"; print getcwd()."\n"; 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 = ""; my $fname_new = ""; my $counter = 1; my $regexReplaceNew = ""; my $counterFmt; for (@sorted_files) { $fname = $_; $fstat = stat($_); $mtime = strftime('%Y/%m/%d %H:%M:%S',localtime($fstat->mtime)); $regexReplaceNew = $regexReplace; $counterFmt = sprintf("%03s",$counter); $regexReplaceNew =~ s/%NR%/$counterFmt/g; $fname_new = $fname; $fname_new =~ s/$regexSearch/$regexReplaceNew/; # $fname_new =~ s/(.*?)\s1-/%NR%_$1/; printf "%-40s%-40s%-20s\n",$fname_new,$fname,$mtime; if($reallyDoIt) { rename($fname,$fname_new); } $counter++; } sub usage { print $help; die "\n"; }