একটি ডিরেক্টরিতে ফোল্ডারগুলির একটি তালিকা পাওয়া


90

রুবি সহ একটি নির্দিষ্ট ডিরেক্টরিতে উপস্থিত ফোল্ডারগুলির একটি তালিকা আমি কীভাবে পাব?

Dir.entries() কাছাকাছি দেখায় তবে কীভাবে কেবল ফোল্ডারে সীমাবদ্ধ করতে হয় তা আমি জানি না।

উত্তর:


71

জর্ডান কাছাকাছি, তবে প্রত্যাশা করা Dir.entriesপুরো পথটি ফিরিয়ে দেয় না File.directory?। এটা চেষ্টা কর:

 Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }

4
নোট করুন যে এটি আপনাকে গোপনীয়গুলির পাশাপাশি (বর্তমান ডিরেক্টরি) এবং (বর্তমান ডিরেক্টরিটির প্যারেন্ট ) সহ সমস্ত ডিরেক্টরি পাবে । বেশিরভাগ ক্ষেত্রে, আপনি কমপক্ষে two দুটি সরাতে চান। '.''..'
টেলিমাচাস

আমি এটিকে পছন্দ করি ... Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
ভিক্টর

তবে আমি এর সমাধানটি আরও স্পষ্ট এবং সংক্ষিপ্ত আকারের দ্বারা ডেকে আছি Dir.glob
ভিক্টর

এটি Dir.glob()অন্য উত্তরে যেমন দেখা গেছে তার চেয়েও
অবাস্তব

105

আমি এটি আরও দরকারী এবং সহজে ব্যবহারযোগ্য খুঁজে পেয়েছি:

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

17
ফোল্ডার পুনরাবৃত্তি করতে, আপনার **/*জায়গায় ব্যবহার করা প্রয়োজন *
mkmurray

4
সহজ এবং সেরা। ধন্যবাদ
বিশ্বজিৎ দাস

4
দুর্দান্ত উত্তর।

47

আমার মতে 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
rweng

4
আরও সংক্ষিপ্তভাবে: পথের নাম.নেউ (কোনও কোনও পথ) .চিলডেন.সিলিট (&: ডিরেক্টরি?)
আবালরগ

19

একটি নির্দিষ্ট ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফোল্ডার সন্ধান করুন:

Dir.glob 'certain_directory/**/*/'

পুনরাবৃত্তিযোগ্য সংস্করণ:

Dir.glob 'certain_directory/*/'

দ্রষ্টব্য: Dir.[]মত কাজ করে Dir.glob


আপনি কীভাবে পুনরাবৃত্ত এবং নন-রিকার্সিভ ফাইলটি একই যুক্তি ব্যবহার করে সন্ধান করবেন? এবং পুনরাবৃত্ত এবং নন-রিকার্সিভ ফাইল এবং ফোল্ডারগুলি কীভাবে?
পিক্সেল


4

আপনি ব্যবহার করতে পারেন File.directory?থেকে FileTestমডিউল খুঁজে বের করতে একটি ফাইলকে একটি ডিরেক্টরি। সঙ্গে এই মিশ্রন Dir.entriesএকটা চমৎকার এক (পর) -liner জন্য করে তোলে:

directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }

সম্পাদনা করুন: স্কটডি এর সংশোধন প্রতি আপডেট হয়েছে।


3

এই এক সঙ্গে, আপনি একটি অ্যারে পেতে পারেন সম্পূর্ণ পাথ আপনার টু ডিরেক্টরি , সাব , subsubdirectories একটি recursive উপায়। আমি এই কোডটি ফাইলের অভ্যন্তরে এই ফাইলগুলি লোড করার জন্য ব্যবহার করেছি config/application

Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }

তদাতিরিক্ত আমাদের বোরিং .এবং আরও কিছু করার দরকার ..নেই। তাদের সাথে ডিল করার জন্য গৃহীত উত্তরটির প্রয়োজন।




1

জেনেরিক সমাধানের জন্য আপনি সম্ভবত ব্যবহার করতে চান

Dir.glob(File.expand_path(path))

এটি ~/*/(আপনার হোম ডিরেক্টরিতে থাকা সমস্ত ফোল্ডার) মতো পাথের সাথে কাজ করবে ।


ধন্যবাদ! এটি খুব সহায়ক।
ফিরফেরিফ

1

আমরা একত্রিত করতে পারেন 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 }

1

কেবল ফোল্ডারগুলি ('।' এবং '..' বাদ রয়েছে):

Dir.glob(File.join(path, "*", File::SEPARATOR))

ফোল্ডার এবং ফাইল:

Dir.glob(File.join(path, "*"))


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