Recursively renames all files in a directory tree with sequential zero-padded numbers (0000001.ext, 0000002.ext, etc.). Preserves file extensions and directory structure. Useful for organizing large collections of files with consistent naming.
perl rename.pl <directory>
Renames all files recursively with 7-digit zero-padded sequential numbers while preserving extensions.
#!/usr/bin/perl
#
sub tree {
my(@filenames);
my($root) = $_[0];
my($i) = 0;
print "\nexploring $root ";
opendir ROOT, $root;
my(@filelist) = readdir ROOT;
closedir ROOT;
foreach $name (@filelist) {
if ($name ne '.' and $name ne '..') {
$name = $root . "\\" . $name;
if (-f $name) {
@filenames = (@filenames, $name);
$i++;
print "." if ($i % 100 == 0);
}
@filenames = (@filenames, tree($name)) if (-d $name);
}
}
print "\n$root: $i files...\n";
return @filenames;
}
@filenames = tree($ARGV[0]) or die "indir fail...";
$i = 1;
foreach $filename (@filenames) {
$filename =~ /^(.*)\\(.*)\.(.*)$/;
$path = $1;
$name = $2;
$ext = $3;
$counter = sprintf('%07d', $i);
rename "$filename", "$path\\$counter.$ext" or print "rename $filename to $path\\$counter.$ext fail...";
$i++;
}