my $gifdir_name = "/home/tony/perl/pmbencor"; opendir my $gifdir_dh, $gifdir_name or die "Can't opendir '$gifdir_name': $!"; my @orig_files = grep { !/^\.\.?$/ } readdir $gifdir_dh; closedir $gifdir_dh; my $there = '/home/tony/perl/newdir'; mkdir $there, 0777 or die "Can't mkdir $there: $!"; my $key_pattern = join '|', map { quotemeta } keys %image_hash; use File::Copy; # this should really be at the top somewhere foreach my $file (@orig_files) { my $new_name = $file; $new_name =~ s/($key_pattern)/$image_hash{$1}/g; move "$gifdir_name/$file", "$there/$new_name" or die "Can't move '$file' to '$new_name': $!"; }