रूबी में निर्देशिका (फ़ाइलों को छोड़कर) की एक सरणी प्राप्त करने का सबसे तेज़, सबसे अधिक अनुकूलित, एक-लाइनर तरीका क्या है?
फ़ाइलों सहित कैसे?
रूबी में निर्देशिका (फ़ाइलों को छोड़कर) की एक सरणी प्राप्त करने का सबसे तेज़, सबसे अधिक अनुकूलित, एक-लाइनर तरीका क्या है?
फ़ाइलों सहित कैसे?
जवाबों:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
इसके बजाय Dir.glob(foo)
आप भी लिख सकते हैं Dir[foo]
(हालांकि Dir.glob
एक ब्लॉक भी ले सकते हैं, जिस स्थिति में यह एक सरणी बनाने के बजाय प्रत्येक पथ का उत्पादन करेगा)।
Dir.glob("**/")
जब तक आप भी सहानुभूति चाहते हैं
File::FNM_DOTMATCH
ध्वज का उपयोग करें ।
Dir.glob("**/*", File::FNM_DOTMATCH)
मेरा मानना है कि यहां कोई भी समाधान छुपी हुई निर्देशिकाओं (जैसे '.test') से निपटता है:
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
मेरे लिए सहायक था
निर्देशिका की सूची के लिए प्रयास करें
Dir['**/']
फ़ाइलों की सूची कठिन है, क्योंकि यूनिक्स निर्देशिका में भी एक फ़ाइल है, इसलिए आपको टाइप करने के लिए परीक्षण करना होगा या लौटी हुई सूची से प्रविष्टियों को निकालना होगा जो अन्य प्रविष्टियों के माता-पिता हैं।
Dir['**/*'].reject {|fn| File.directory?(fn) }
और बस सभी फाइलों और निर्देशिकाओं की सूची के लिए
Dir['**/*']
केवल निर्देशिका
`find -type d`.split("\n")
निर्देशिकाएँ और सामान्य फाइलें
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
end.select {}.flatten()
हिस्सा समझा सकता है ? मुझे फंक्शन ओवरऑल पसंद है। ऐसा लगता है कि सरणियों की एक सरणी बनाएगा? क्या इसके elseif
साथ भाग करना संभव होगा : rec_path(child, file) << child.to_s
ताकि आप इसे एक सरणी में असाइन कर सकें और एक स्ट्रिंग प्राप्त कर सकें? धन्यवाद!
जैसा कि अन्य उत्तरों में यहां दिया गया है, आप उपयोग कर सकते हैं Dir.glob
। ध्यान रखें कि फ़ोल्डरों में बहुत सारे अजीब चरित्र हो सकते हैं, और ग्लोब तर्क पैटर्न हैं, इसलिए कुछ पात्रों के विशेष अर्थ हैं। जैसे, यह निम्नलिखित की तरह कुछ करने के लिए असुरक्षित है:
Dir.glob("#{folder}/**/*")
इसके बजाय करें:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
किसी निर्देशिका की सामग्री और उसकी सभी उपनिर्देशिकाओं को प्राप्त करने के लिए PHP या अन्य भाषाओं में, आपको कोड की कुछ पंक्तियाँ लिखनी होंगी, लेकिन रूबी में यह 2 पंक्तियाँ लेता है:
require 'find'
Find.find('./') do |f| p f end
यह वर्तमान निर्देशिका और इसकी सभी उपनिर्देशिकाओं की सामग्री को प्रिंट करेगा।
या छोटा, आप ’**’
नोटेशन का उपयोग कर सकते हैं :
p Dir['**/*.*']
समान परिणाम प्राप्त करने के लिए आप PHP या जावा में कितनी लाइनें लिखेंगे?
हालांकि एक पंक्ति समाधान नहीं है, मुझे लगता है कि यह रूबी कॉल का उपयोग करने का सबसे अच्छा तरीका है।
पहले सभी फ़ाइलों को पुनरावर्ती रूप से
हटा दें दूसरा सभी सभी खाली निर्देशिकाओं को हटा दें
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
यहाँ एक उदाहरण दिया गया है जो कि Dir.glob के साथ रेल परियोजना निर्देशिका की गतिशील खोज को जोड़ती है:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, लेकिन अभी भी सब-फोल्डर और एसेट फोल्डर के अंदर की फाइलेंRails.application.config.assets.paths