while(){ # s/\.(?=.*?\.)/_/g; # can you this if you know you have only the filename s#\.(?!.*?/)(?=.*?\.)#_#g; # This one accounts for paths, and modifies only the filename print; } __DATA__ test.zip blah.blah.ext/stuff.bar/test0.file0.new_20060411.zip test1.file1.new_20060411.zip test2.file2.new_20060411.zip test3.file3.new_20060411.zip #### ls | perl -ne 'chomp; $f=$_; s#\.(?!.*?/)(?=.*?\.)#_#g; print "mv $f $_\n";'