Cara mendapatkan nama file tanpa ekstensi dari jalur file di Ruby

233

Bagaimana saya bisa mendapatkan nama file dari jalur file di Ruby?

Sebagai contoh jika saya memiliki jalur "C:\projects\blah.dll"dan saya hanya ingin "bla".

Apakah ada LastIndexOfmetode di Ruby?

dagda1
sumber
3
Ingatlah bahwa tidak ada yang istimewa dari sebuah titik yang diikuti oleh beberapa (tiga, mungkin) karakter. Mereka adalah bagian dari nama file. Beberapa sistem operasi pinggiran berpikir ada sesuatu yang istimewa tentang bagian nama file itu, tetapi Anda tidak boleh jatuh ke dalam perangkap itu.
James Moore

Jawaban:

94
require 'pathname'

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

Saya belum pernah menjadi pengguna Windows dalam waktu yang lama, tetapi Pathdoc rdoc mengatakan tidak memiliki masalah dengan pemisah nama direktori pada Windows.

NobodyNada
sumber
86
Saya tidak tahu mengapa ini adalah jawaban peringkat # 1 ketika File.basename tidak memerlukan tambahan 'persyaratan' dari 'pathname'.
GroovyCakes
11
Class pathnamebekerja dengan nama path lokal sementara Fileselalu mengasumsikan nama path Unix (perbedaannya adalah path dan drive separator yang digunakan dalam MS Windows, misalnya)
nimrodm
3
Meskipun diterima oleh OP, jawaban ini sebenarnya tidak menanggapi pertanyaan OP. Lihat jawaban Jonathan Lonowski dan Arup Rakshit.
GSnyder
6
Perpanjangan hadir jika ada. Jawabannya salah.
Ludovic Kuty
4
Tolong jangan merusak posting Anda sendiri. Terima kasih!
NobodyNada
586

Mencoba File.basename

Mengembalikan komponen terakhir dari nama file yang diberikan dalam file_name, yang harus dibentuk menggunakan garis miring (`` / '') terlepas dari pemisah yang digunakan pada sistem file lokal. Jika suffix diberikan dan hadir di akhir file_name, sufiks dihapus.

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

Dalam kasus Anda:

File.basename("C:\\projects\\blah.dll", ".dll")  #=> "blah"
Jonathan Lonowski
sumber
Dengan Linux dan Ruby 1.8 saya mencoba Pathname.new("some/path/to/my.file").basenamedan mendapatkan my.file/: '(
java.is.for.desktop
67
Lebih umum lagi,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
kelloti
Jawabannya harus menambahkan solusi @kelloti yang lebih baik.
ymoreau
@ Seloti: Bagaimana /my/file.tar.gz?
Richard-Degenne
56

Jika ekstensi tidak diketahui (perlu / pemisah):

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"
Vinko Vrsalovic
sumber
5
File.basename () adalah jawabannya!
sivabudh
26

Jonathan Lonowski menjawab dengan sempurna, tetapi ada sesuatu yang tidak ada jawaban yang disebutkan di sini. Alih-alih File::extname, Anda dapat langsung menggunakan '.*'untuk mendapatkan nama file.

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

Tetapi, jika Anda ingin mendapatkan nama file dasar dari setiap file ekstensi tertentu , maka Anda harus menggunakan File::extname, jika tidak, tidak.

Arup Rakshit
sumber
13

Coba kode ini

Menggunakan extname

 File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test" 
Rahul Patel
sumber
8

Jawaban Jonathon lebih baik, tetapi memberi tahu Anda somelist[-1]adalah salah satu dari LastIndexOfnotasi yang tersedia.

Seperti disebutkan krusty.ar somelist.lasttampaknya juga.

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"
monkut
sumber
1
masalah dengan itu adalah bahwa Anda perlu tahu apakah itu backslash atau forwardslash
Joseph Le Brech
4

Perhatikan bahwa string tanda kutip ganda lolos.

'C:\projects\blah.dll'.split('\\').last
krusty.ar
sumber
5
Memperlakukannya murni sebagai string, bukan sebagai jalur, membuat kode lebih mudah dibawa-bawa.
boatcoder
Ini jauh lebih rumit daripada yang dibutuhkan, dan khusus untuk Windows. Anda bisa saja File.basename. Dan, seperti beberapa jawaban lainnya, tidak menjawab pertanyaan OP.
Keith Bennett
0

Jika Anda memiliki akses ke variabel ENV, scandikombinasikan dengan regex kecil ini (yang menemukan kata terakhir tapi satu, titik, maka kata terakhir dari string) akan memasukkan nama file ke 'nama file':

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

Jelas, Anda dapat menggunakan scandan regex pada nama jalur apa pun yang menyertakan nama file, dan __FILE__merupakan pilihan yang jelas:

__FILE__.scan(/\w+\.\w+$/)
Dave Everitt
sumber
-5

Anda bisa mendapatkan jalur direktori ke skrip saat ini dengan:

File.dirname __FILE__
Smar
sumber
Pertanyaannya bukan tentang path, itu tentang nama file . "Bagaimana saya bisa mendapatkan nama file dari path file di Ruby?"
fontno
Itu akan menjadi:File.basename __FILE__
Samuel