my $existingfiles_dir; my $newfiles_dir; my $dest_dir; opendir XFD, $existingfiles_dir or die "read $existingfiles_dir : $!"; opendir NFD, $newfiles_dir or die "read $newfiles_dir : $!"; for my $file ( readdir NFD ) { # parse my( $num, $ver, $ext ) = $file =~ /(\d+x)(\d*)(\..*)/; # find the last of the files it might collide with: my( $last ) = sort { $b <=> $a } # sort version numbers descending map { /^$num(.*)\Q$ext/ ? $1 : () } readdir XFD; rewinddir XFD; # take the next available number: $ver = $last ? $last + 1 : ''; rename $file, $num.$ver.$last; }