रूबी में फ़ाइल पथ से विस्तार के बिना फ़ाइल नाम कैसे प्राप्त करें


233

मैं रूबी में फ़ाइल पथ से फ़ाइल नाम कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए अगर मेरे पास एक रास्ता है "C:\projects\blah.dll"और मैं सिर्फ "ब्ला" चाहता हूं।

क्या LastIndexOfरूबी में एक विधि है?


3
ध्यान रखें कि कुछ (तीन, शायद) वर्णों के बाद एक डॉट के बारे में कुछ खास नहीं है। वे फ़ाइल के नाम का हिस्सा हैं। कुछ फ्रिंज ऑपरेटिंग सिस्टम सोचते हैं कि फ़ाइल नाम के उस हिस्से के बारे में कुछ विशेष है, लेकिन आपको उस जाल में नहीं पड़ना चाहिए।
जेम्स मूर

जवाबों:


94
require 'pathname'

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

मैं लंबे समय से विंडोज उपयोगकर्ता नहीं रहा हूं, लेकिन Pathname rdoc का कहना है कि इसमें विंडोज पर डायरेक्टरी-नाम सेपरेटर के साथ कोई समस्या नहीं है।


86
मुझे नहीं पता कि यह # 1 रैंक का उत्तर क्यों है जब File.basename को 'pathname' की अतिरिक्त 'आवश्यकता' की आवश्यकता नहीं होती है।
GroovyCakes

11
क्लास pathnameस्थानीय लोकनामों के साथ काम करती है जबकि Fileहमेशा यूनिक्स पाथनेम्स मानती है (अंतर पथ और ड्राइव विभाजक हैं जो एमएस विंडोज में उपयोग किए जाते हैं, उदाहरण के लिए)
nimrodm

3
ओपी द्वारा स्वीकार किए जाने के बावजूद, यह जवाब वास्तव में ओपी के सवाल का जवाब नहीं देता है। जोनाथन लोनोस्की और अरूप रक्षित के जवाब देखें।
जीसनीडर

6
विस्तार मौजूद है अगर वहाँ एक है। उत्तर गलत है।
लुडोविक क्रूट

4
कृपया अपने स्वयं के पदों को बर्खास्त न करें। धन्यवाद!
नाडा

586

प्रयत्न File.basename

फ़ाइल_नाम में दिए गए फ़ाइलनाम के अंतिम घटक को लौटाता है, जिसे स्थानीय फ़ाइल सिस्टम पर उपयोग किए गए विभाजक की परवाह किए बिना फॉरवर्ड स्लैश (`` / '') का उपयोग करके बनाया जाना चाहिए। यदि प्रत्यय दिया गया है और 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 के साथ मैं कोशिश करता हूं Pathname.new("some/path/to/my.file").basenameऔर मिलता हूं my.file/: '(
java.is.for.desktop

67
अधिक सामान्य रूप से,File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
केलोटी

उत्तर @kelloti का समाधान जोड़ना चाहिए जो बेहतर है।
ymoreau

@kelloti: किस बारे में /my/file.tar.gz?
रिचर्ड-डिगेंने

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 () उत्तर है!
शिवबाबू

26

जोनाथन लोनोवस्की ने पूरी तरह से उत्तर दिया, लेकिन कुछ ऐसा है जो यहां वर्णित किसी भी उत्तर में नहीं है। इसके बजाय File::extname, आप '.*'फ़ाइल नाम प्राप्त करने के लिए सीधे उपयोग कर सकते हैं ।

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
इसके साथ समस्या यह है कि आपको यह जानना जरूरी है कि यह बैकस्लैश है या फॉरवर्डलैश
जोसेफ ले ब्रेच

4

ध्यान दें कि दोहरे उद्धरण तार से बच जाते हैं।

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

5
यह एक पथ के बजाय एक स्ट्रिंग के रूप में विशुद्ध रूप से व्यवहार करता है, कोड को कम पोर्टेबल बनाता है।
बोटकोडर

यह तरीका जरूरत से ज्यादा जटिलता है, और विंडोज-विशिष्ट है। आप बस कर सकते हैं File.basename। और, कुछ अन्य उत्तरों की तरह, ओपी के प्रश्न का उत्तर नहीं देता है।
कीथ बेनेट

0

यदि आपके पास ENV चर तक पहुंच है, तो scanइस छोटे से रेगेक्स के साथ संयुक्त (जो अंतिम लेकिन एक शब्द, एक डॉट, फिर स्ट्रिंग का अंतिम शब्द पाता है) फ़ाइल का नाम 'फ़ाइलनाम' में डाल देगा:

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

स्पष्ट रूप से, आप scanकिसी भी पथ नाम पर फ़ाइल नाम का उपयोग कर सकते हैं और regex, और __FILE__स्पष्ट विकल्प है:

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

-5

आप वर्तमान स्क्रिप्ट के लिए निर्देशिका पथ प्राप्त कर सकते हैं:

File.dirname __FILE__

प्रश्न पथ के बारे में नहीं था, यह फ़ाइल नाम के बारे में था । "मैं रूबी में फ़ाइल पथ से फ़ाइल नाम कैसे प्राप्त कर सकता हूं ?"
फोंटनो

वह होगा:File.basename __FILE__
शमूएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.