माणिक के साथ एक निश्चित निर्देशिका में मौजूद फ़ोल्डर्स की सूची कैसे प्राप्त करूं?
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
एक अच्छे (ish) -लाइनर के लिए इसके साथ संयोजन :
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
संपादित करें: प्रति स्कॉट्स सुधार के बारे में अपडेट किया गया।
इस एक के साथ, आप अपनी निर्देशिकाओं , उपनिर्देशिकाओं , उप - सूचियों के लिए एक पूर्ण पथ का सरणी प्राप्त कर सकते हैं एक पुनरावर्ती तरीके । मैंने उस कोड का उपयोग इन फ़ाइलों को 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))
यह पथों की तरह काम करेगा ~/*/
(आपके घर निर्देशिका के भीतर सभी फ़ोल्डर)।
हम बोरह के उत्तर और जोहान्स के उत्तर को एक फ़ोल्डर में निर्देशिका नाम प्राप्त करने के लिए काफी सुरुचिपूर्ण समाधान प्राप्त कर सकते हैं।
# 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)
। अधिक जानकारी के लिए FileTest के लिए प्रलेखन देखें ।
'.'
(वर्तमान निर्देशिका) और'..'
(वर्तमान निर्देशिका के माता-पिता ) सहित मिलेगा । ज्यादातर मामलों में, आप कम से कम उन दो को हटाना चाहते हैं।