use warnings; use strict; use File::Find::Rule; my $path = $ARGV[0]; my $from = $ARGV[1]; my $to = $ARGV[2]; die "You must supply a full directory path" unless (-e $path && -d $path); my @dirs = File::Find::Rule->directory() ->name("*$from*") ->in($path); for (@dirs) { my $orig = $_; s/$from/$to/g; rename $orig, $_ or die "Can not rename $orig to $_: $!"; }