# Filename without extension in Ruby

posted 2012-Mar-23

Ruby’s File.basename method gives you the name of a file in a path string:

File.basename( "foo/bar/jim-jam/whee.html" )       #=> "whee.html"


Not clearly explained in the documentation, however, is the fact you can pass a second parameter of ".*" to remove any extension from that file:

File.basename( "foo/bar/jim-jam/whee.html", ".*" ) #=> "whee"


Want a path to the same file with a different extension (e.g. changing a “.png” to a “.jpg”)? You could do this:

filename  = File.basename(my_path,".*")
othername = File.join( File.dirname(my_path), "#{filename}.jpg" )


…but I’d rather just do this:

# replace non-period characters after a period, at the end of the string, with '.jpg'
othername = my_path.sub /\.[^.]+\z/, ".jpg"

 Pavel K 09:57AM ET2013-Dec-12 ideally: othername = my_path.sub(/.[^.]+\z/,”.jpg”) # replace non-period characters at the end of the string with ‘jpg’ not all files have extensions Gavin Kistner 11:31AM ET2015-May-17 @PavelK: Excellent point. I’ve modified the code to match.