Rubyのファイルパスから拡張子なしのファイル名を取得する方法


233

Rubyのファイルパスからファイル名を取得するにはどうすればよいですか?

たとえば、パスが"C:\projects\blah.dll"あり、「何とか」が欲しいだけの場合。

LastIndexOfRubyにメソッドはありますか?


3
ドットの後にいくつか(おそらく3つ)の文字が続くことについては、特別なことは何もないことに注意してください。それらはファイル名の一部です。一部の周辺のオペレーティングシステムは、ファイル名のその部分に特別なものがあると考えていますが、その罠に陥ってはなりません。
James Moore

回答:


94
require 'pathname'

Pathname.new('/opt/local/bin/ruby').basename
# => #<Pathname:ruby>

私は長い間Windowsユーザーではありませんでしたが、パス名rdocは、Windowsのディレクトリ名の区切り文字には問題がないと言っています。


86
File.basenameが 'pathname'の追加の 'require'を必要としないときに、これがなぜ#1ランクの回答であるのか、私にはわかりません。
GroovyCakes 2012

11
クラスpathnameはローカルパス名で機能しFileますが、常にUnixパス名を想定します(たとえば、MS Windowsで使用されるパスとドライブのセパレーターが異なります)
nimrodm

3
OPに受け入れられているにもかかわらず、この回答は実際にはOPの質問に答えるものではありません。Jonathan Lonowskiの回答とArup Rakshitの回答を参照してください。
GSnyder 2016年

6
拡張子がある場合は存在します。答えは間違っています。
Ludovic Kuty

4
自分の投稿を破壊しないでください。ありがとう!
NobodyNada 2016年

586

試す File.basename

file_nameで指定されたファイル名の最後のコンポーネントを返します。これは、ローカルファイルシステムで使用されている区切り文字に関係なく、スラッシュ( `` / '')を使用して形成する必要があります。接尾辞が指定され、file_nameの末尾にある場合、それは削除されます。

File.basename("/home/gumby/work/ruby.rb")          #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb")   #=> "ruby"

あなたの場合:

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"

LinuxとRuby 1.8で私Pathname.new("some/path/to/my.file").basenamemy.file/: '(
java.is.for.desktop

67
より一般的には、File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
ケロティ2012年

答えは、@ kellotiのソリューションを追加することです。
ymoreau

@kelloti:どう/my/file.tar.gzですか?
Richard-Degenne、

56

拡張子がわからない場合(/セパレーターが必要です):

irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/")
=> "C:/foobar/blah.txt"
irb(main):027:0> File.basename(f,File.extname(f))
=> "blah"

5
File.basename()が答えです!
sivabudh 2011年

26

Jonathan Lonowskiは完璧に答えましたが、ここで述べられている答えのどれもないものがあります。の代わりにFile::extname、直接a '.*'を使用してファイル名を取得できます。

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah"

ただし、特定の拡張ファイルのベースファイル名を取得するFile::extname場合は、を使用する必要があります。それ以外の場合は使用しません。



8

ジョナソンの答えはより良いですが、あなたに知らせるsomelist[-1]ためにLastIndexOf利用可能な表記法の一つです。

krusty.arが述べているようsomelist.lastに、それも明らかにそうです。

irb(main):003:0* f = 'C:\\path\\file.txt'
irb(main):007:0> f.split('\\')
=> ["C:", "path", "file.txt"]
irb(main):008:0> f.split('\\')[-1]
=> "file.txt"

1
それに関する問題は、それがバックスラッシュかフォワードスラッシュかどうかを知る必要があるということです
Joseph Le Brech

4

二重引用符の文字列は\をエスケープすることに注意してください。

'C:\projects\blah.dll'.split('\\').last

5
パスとしてではなく純粋に文字列として扱い、コードの移植性を低下させます。
ボートコーダー2010年

これは必要以上に複雑で、Windows固有です。あなただけができますFile.basename。そして、他のいくつかの回答と同様に、OPの質問には回答しません。
キースベネット

0

ENV変数にアクセスできる場合scan、この小さな正規表現(最後の1つだけの単語、ドット、次に文字列の最後の単語を見つける)と組み合わせると、ファイル名が「filename」に配置されます。

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/)

もちろん、scanファイル名を含む任意のパス名で正規表現を使用できます。これ__FILE__は明らかな選択です。

__FILE__.scan(/\w+\.\w+$/)

-5

あなたは現在のスクリプトへのディレクトリパスを得ることができます:

File.dirname __FILE__

問題はパスではなく、ファイル名に関するものでした。「Rubyのファイルパスからファイル名を取得するにはどうすればよいですか?」
fontno 2013年

それは次のようになります:File.basename __FILE__
サミュエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.