What I use on Unix:
$ cat renum
#! /usr/bin/perl -w
use strict;
my $len = 0;
if ($ARGV[0] =~ /^\d+$/)
{
$len = shift;
}
elsif ($ARGV[$#ARGV] =~ /^\d+$/)
{
$len = pop;
}
else
{
foreach my $f (@ARGV)
{
$f =~ /(\d+)(\D*)$/;
$len = length $1 if length $1 > $len;
}
}
unless ($len)
{
print "No length given/discovered\n";
exit 1;
}
foreach my $f (@ARGV)
{
(my $newf = $f) =~ s/(\d+)(\D*)$/sprintf "%0${len}d%s", $1, $2/e;
if ($newf ne $f)
{
print "$f -> $newf\n";
rename $f, $newf;
}
}
However, if you want this to work cleanly on Windows, too, I'd just add a line near the top like this:
@ARGV = map { glob $_ } @ARGV) and then you could run this as
perl renum e:/perl/comics/*.png - it would figure out that the largest number is 3 digits long, and renam all of them to be 3 digits long. Slightly more generic.