রুবির ফাইল পথ থেকে এক্সটেনশন ছাড়াই ফাইল নাম কীভাবে পাবেন


233

আমি রুবির ফাইল পাথ থেকে কীভাবে ফাইলের নাম পেতে পারি?

উদাহরণস্বরূপ যদি আমার কোনও পথ থাকে "C:\projects\blah.dll"এবং আমি কেবল "বেলা" চাই।

LastIndexOfরুবিতে কি কোনও পদ্ধতি আছে?


3
মনে রাখবেন যে কিছু (তিন, সম্ভবত) অক্ষর অনুসরণ করে একটি বিন্দু সম্পর্কে বিশেষ কিছুই নেই। তারা ফাইলটির নামের অংশ। কিছু ফ্রিঞ্জ অপারেটিং সিস্টেমগুলি মনে করে যে কোনও ফাইলনামের সেই অংশটি সম্পর্কে বিশেষ কিছু আছে তবে আপনার সেই ফাঁদে পড়া উচিত নয়।
জেমস মুর

উত্তর:


94
require 'pathname'

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

আমি দীর্ঘদিন ধরে উইন্ডোজ ব্যবহারকারী হইনি, তবে প্যাথনাম rdoc বলছে উইন্ডোজে ডিরেক্টরি-নাম বিভাজক নিয়ে এটির কোনও সমস্যা নেই।


86
ফাইল.ব্যাসনেমে 'পথের নাম' এর অতিরিক্ত 'প্রয়োজনীয়' প্রয়োজন হয় না কেন আমি কেন জানি না এটি # 1 টি উত্তর।
গ্রোভিকেকস

11
ক্লাস pathnameকরার সময় স্থানীয় pathnames সাথে কাজ করে File(পার্থক্য নেই পাথ এবং ড্রাইভ বিভাজক যা মাইক্রোসফট উইন্ডোজ ব্যবহার করা হয় উদাহরণস্বরূপ) সবসময় ইউনিক্স pathnames অনুমান
nimrodm

3
ওপি কর্তৃক গৃহীত হওয়া সত্ত্বেও এই উত্তরটি আসলে ওপি-র প্রশ্নের জবাব দেয় না। জোনাথন লোনোস্কির এবং অরূপ রক্ষিতের উত্তর দেখুন।
জি স্নাইডার

6
এক্সটেনশন উপস্থিত থাকলে উপস্থিত থাকে। উত্তরটি ভুল।
লুডোভিক কিউটি

4
আপনার নিজের পোস্ট ভাংচুর করবেন না দয়া করে। ধন্যবাদ!
কেউই নদা

586

চেষ্টা File.basename

স্থানীয় ফাইল সিস্টেমে ব্যবহৃত বিভাজন নির্বিশেষে ফাইল_নামে দেওয়া ফাইলনামের সর্বশেষ উপাদানটি ফেরত দেয় যা অবশ্যই ফরওয়ার্ড স্ল্যাশ (`` / '') ব্যবহার করে গঠন করা উচিত। প্রত্যয়টি যদি ফাইল_নামের শেষে দেওয়া হয় এবং উপস্থিত হয় তবে তা সরিয়ে ফেলা হবে।

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 এবং রুবি 1.8 আমি চেষ্টা Pathname.new("some/path/to/my.file").basenameএবং পেতে my.file/'(:
java.is.for.desktop

67
আরও File.basename("C:\\projects\\blah.dll", ".*") #=> "blah"
উদারভাবে

উত্তরটি @Keloti এর সমাধান যুক্ত করা উচিত যা ভাল।
ymoreau

@ কেলোটি: কি হবে /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
ফাইল.বেসনেম () এর উত্তর!
শিববধু

26

জোনাথন লোনোস্কি পুরোপুরি উত্তর দিয়েছেন, তবে এমন কিছু আছে যা এখানে বর্ণিত উত্তরগুলির মধ্যে একটিও নয়। পরিবর্তে File::extname, আপনি সরাসরি '.*'ফাইলের নাম পেতে একটি ব্যবহার করতে পারেন ।

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

তবে, আপনি যদি কোনও নির্দিষ্ট এক্সটেনশন ফাইলের বেস ফাইলের নাম পেতে চান তবে আপনাকে ব্যবহার করা দরকার File::extname, অন্যথায় নয়।



8

জনাথনের উত্তর আরও ভাল, তবে আপনাকে অবহিত করার জন্য উপলব্ধ somelist[-1]একটি LastIndexOfস্বরলিপি।

ক্রাস্টি.আর হিসাবে উল্লিখিত হিসাবে 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

আপনার যদি scanএই এনভিভি ভেরিয়েবলগুলিতে অ্যাক্সেস থাকে তবে এই ছোট্ট রেইগেক্সের সাথে মিলিত (যা শেষটি কিন্তু একটি শব্দ, একটি বিন্দুর সন্ধান করে) তবে স্ট্রিংয়ের শেষ শব্দটি ফাইলটির নাম 'ফাইলের নাম' এ রাখবে:

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

স্পষ্টতই, আপনি ব্যবহার করতে পারেন scanএবং ফাইলের নাম অন্তর্ভুক্ত যে কোনও পাথের নামতে রেজিএক্স, এবং __FILE__এটি সুস্পষ্ট পছন্দ:

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

-5

আপনি এটির সাথে বর্তমান স্ক্রিপ্টের ডিরেক্টরি পথ পেতে পারেন:

File.dirname __FILE__

প্রশ্নটি পথ সম্পর্কে ছিল না, এটি ফাইলের নাম সম্পর্কে ছিল । "আমি রুবির কোনও ফাইল পাথ থেকে ফাইলের নাম কীভাবে পেতে পারি ?"
ফন্টনো

এটি হবে:File.basename __FILE__
স্যামুয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.