রুবি সহ একটি নির্দিষ্ট ডিরেক্টরিতে উপস্থিত ফোল্ডারগুলির একটি তালিকা আমি কীভাবে পাব?
Dir.entries()
কাছাকাছি দেখায় তবে কীভাবে কেবল ফোল্ডারে সীমাবদ্ধ করতে হয় তা আমি জানি না।
রুবি সহ একটি নির্দিষ্ট ডিরেক্টরিতে উপস্থিত ফোল্ডারগুলির একটি তালিকা আমি কীভাবে পাব?
Dir.entries()
কাছাকাছি দেখায় তবে কীভাবে কেবল ফোল্ডারে সীমাবদ্ধ করতে হয় তা আমি জানি না।
উত্তর:
জর্ডান কাছাকাছি, তবে প্রত্যাশা করা Dir.entries
পুরো পথটি ফিরিয়ে দেয় না File.directory?
। এটা চেষ্টা কর:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
।
Dir.glob()
অন্য উত্তরে যেমন দেখা গেছে তার চেয়েও
আমি এটি আরও দরকারী এবং সহজে ব্যবহারযোগ্য খুঁজে পেয়েছি:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
এটি বর্তমান ডিরেক্টরিতে সমস্ত ফোল্ডার পায়, বাদ .
এবং ..
।
ফোল্ডার পুনরাবৃত্তি করার জন্য সহজেই **
এর জায়গায় ব্যবহার করুন *
।
Dir.glob
লাইন এছাড়াও প্রেরণ করা সম্ভব Dir.chdir
একটি ব্লক হিসাবে:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
জায়গায় ব্যবহার করা প্রয়োজন *
।
আমার মতে Pathname
প্লেইন স্ট্রিংয়ের চেয়ে ফাইলনামের পক্ষে আরও ভাল।
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
এটি আপনাকে সেই ডিরেক্টরিতে পাঠ্যনামের অবজেক্ট হিসাবে সমস্ত ডিরেক্টরিতে একটি অ্যারে দেয়।
আপনি যদি স্ট্রিং করতে চান
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
যদি directory_name
পরম ছিল তবে এই স্ট্রিংগুলিও পরম।
Pathname
হ'ল এটি স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় .
, ..
এবং ব্যক্তিগত ফাইলগুলি যেমন.DS_Store
একটি নির্দিষ্ট ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফোল্ডার সন্ধান করুন:
Dir.glob 'certain_directory/**/*/'
পুনরাবৃত্তিযোগ্য সংস্করণ:
Dir.glob 'certain_directory/*/'
দ্রষ্টব্য: Dir.[]
মত কাজ করে Dir.glob
।
আপনি ব্যবহার করতে পারেন File.directory?
থেকে FileTest
মডিউল খুঁজে বের করতে একটি ফাইলকে একটি ডিরেক্টরি। সঙ্গে এই মিশ্রন Dir.entries
একটা চমৎকার এক (পর) -liner জন্য করে তোলে:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
সম্পাদনা করুন: স্কটডি এর সংশোধন প্রতি আপডেট হয়েছে।
এই এক সঙ্গে, আপনি একটি অ্যারে পেতে পারেন সম্পূর্ণ পাথ আপনার টু ডিরেক্টরি , সাব , subsubdirectories একটি recursive উপায়। আমি এই কোডটি ফাইলের অভ্যন্তরে এই ফাইলগুলি লোড করার জন্য ব্যবহার করেছি config/application
।
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
তদাতিরিক্ত আমাদের বোরিং .
এবং আরও কিছু করার দরকার ..
নেই। তাদের সাথে ডিল করার জন্য গৃহীত উত্তরটির প্রয়োজন।
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
reject !
,select
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media"
Dir.glob("#{$dir_target}/**/*").each do |f|
if File.directory?(f)
puts "#{f}\n"
end
end
জেনেরিক সমাধানের জন্য আপনি সম্ভবত ব্যবহার করতে চান
Dir.glob(File.expand_path(path))
এটি ~/*/
(আপনার হোম ডিরেক্টরিতে থাকা সমস্ত ফোল্ডার) মতো পাথের সাথে কাজ করবে ।
আমরা একত্রিত করতে পারেন Borh এর উত্তর এবং জোহানেস 'উত্তর ফোল্ডারে ডিরেক্টরির নাম পেয়ে বেশ একটি মার্জিত সমাধান পেতে।
# user globbing to get a list of directories for a path
base_dir_path = ''
directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
# or recursive version:
directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', ''))
# cast to Pathname
directories = directory_paths.collect {|path| Pathname.new(path) }
# return the basename of the directories
directory_names = directories.collect {|dir| dir.basename.to_s }
আমি মনে করি আপনি প্রতিটি ফাইল এটি ডিরেক্টরিতে কিনা তা পরীক্ষা করতে পারেন FileTest.directory? (file_name)
। আরও তথ্যের জন্য ফাইলস্টেস্টের জন্য ডকুমেন্টেশন দেখুন ।
'.'
'..'