एक निर्देशिका में फ़ोल्डरों की सूची प्राप्त करना


90

माणिक के साथ एक निश्चित निर्देशिका में मौजूद फ़ोल्डर्स की सूची कैसे प्राप्त करूं?

Dir.entries() पास दिखता है, लेकिन मुझे नहीं पता कि केवल फ़ोल्डर्स तक कैसे सीमित किया जाए।

जवाबों:


71

जॉर्डन करीब है, लेकिन उम्मीद है Dir.entriesकि पूरा रास्ता नहीं लौटाता File.directory?है। इसे इस्तेमाल करे:

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

3
ध्यान दें कि यह आपको सभी निर्देशिकाओं के साथ-साथ छिपे हुए '.'(वर्तमान निर्देशिका) और '..'(वर्तमान निर्देशिका के माता-पिता ) सहित मिलेगा । ज्यादातर मामलों में, आप कम से कम उन दो को हटाना चाहते हैं।
टेलीमेकस

मुझे यह पसंद है ... Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
विक्टर

लेकिन मैंने एक समाधान को और अधिक स्पष्ट और संक्षिप्त रूप से इस्तेमाल किया Dir.glob
विक्टर

यह सिर्फ Dir.glob()दूसरे शब्दों में देखे जाने की तुलना में उद्देश्यपूर्ण रूप से बदतर है - मैं दृढ़ता से सिर्फ यह करने की सिफारिश
करूंगा

106

मैंने इसे और अधिक उपयोगी और उपयोग में आसान पाया है:

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
फ़ोल्डरों की पुनरावृत्ति करने के लिए, आपको इसके **/*स्थान पर उपयोग करना होगा *
19km पर mkmurray

1
सरल और सर्वश्रेष्ठ। धन्यवाद
विश्वजीत दास

बहुत बढ़िया जवाब।
सेवानिवृत्त

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

3
अधिक कठिन: Pathname.new (somepath) .children.select (&: directory?)
ablarg

19

किसी निश्चित निर्देशिका के अंतर्गत सभी फ़ोल्डर्स को पुन: खोज लें:

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

गैर-पुनरावर्ती संस्करण:

Dir.glob 'certain_directory/*/'

नोट: Dir.[]जैसे काम करता है Dir.glob


आप एक ही तर्क का उपयोग करके पुनरावर्ती और गैर-पुनरावर्ती फ़ाइल कैसे प्राप्त करेंगे? और कैसे पुनरावर्ती और गैर-पुनरावर्ती फ़ाइल और फ़ोल्डर्स?
पिक्सेल


4

यदि कोई फ़ाइल निर्देशिका है, तो यह जानने के लिए आप मॉड्यूल File.directory?से उपयोग कर सकते हैं FileTestDir.entriesएक अच्छे (ish) -लाइनर के लिए इसके साथ संयोजन :

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

संपादित करें: प्रति स्कॉट्स सुधार के बारे में अपडेट किया गया।


3

इस एक के साथ, आप अपनी निर्देशिकाओं , उपनिर्देशिकाओं , उप - सूचियों के लिए एक पूर्ण पथ का सरणी प्राप्त कर सकते हैं एक पुनरावर्ती तरीके । मैंने उस कोड का उपयोग इन फ़ाइलों को config/applicationफ़ाइल के अंदर करने के लिए उत्सुक करने के लिए किया ।

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

इसके अलावा, हम उबाऊ .और ..अब से निपटने की जरूरत नहीं है। उनसे निपटने के लिए स्वीकृत उत्तर की आवश्यकता है।




1

एक सामान्य समाधान के लिए जिसे आप शायद उपयोग करना चाहते हैं

Dir.glob(File.expand_path(path))

यह पथों की तरह काम करेगा ~/*/(आपके घर निर्देशिका के भीतर सभी फ़ोल्डर)।


धन्यवाद! यह बहुत मददगार है।
21

1

हम बोरह के उत्तर और जोहान्स के उत्तर को एक फ़ोल्डर में निर्देशिका नाम प्राप्त करने के लिए काफी सुरुचिपूर्ण समाधान प्राप्त कर सकते हैं।

# 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, "*"))


0

मुझे लगता है कि आप प्रत्येक फ़ाइल को यह देखने के लिए परीक्षण कर सकते हैं कि क्या यह एक निर्देशिका है FileTest.directory? (file_name)। अधिक जानकारी के लिए FileTest के लिए प्रलेखन देखें ।

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