Try: perl -le 'print $ARGV[-1] =~ s/[\d\a]+(?=\.)/++($i=$&)/er' file*.txt That will give you `file_10.txt` after `file_9.txt`, `file_g.txt` after `file_f.txt`, `file_aa.txt` after `file_z.txt`, but not `file_ab.txt` after `file_aa.txt` because the `file*` shell glob will sort `file_z.txt` _after_ `file_aa.txt`.