রুবিতে ডিরেক্টরিগুলি (ফাইলগুলি বাদে) পাওয়ার জন্য দ্রুত, সর্বাধিক অনুকূল, ওয়ান-লাইনার উপায় কী?
কিভাবে ফাইল অন্তর্ভুক্ত সম্পর্কে?
রুবিতে ডিরেক্টরিগুলি (ফাইলগুলি বাদে) পাওয়ার জন্য দ্রুত, সর্বাধিক অনুকূল, ওয়ান-লাইনার উপায় কী?
কিভাবে ফাইল অন্তর্ভুক্ত সম্পর্কে?
উত্তর:
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)
আমি বিশ্বাস করি যে এখানে সমাধানগুলির কোনওটিই লুকানো ডিরেক্টরিগুলি (যেমন '.টেস্ট') ব্যবহার করে না:
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) } }
ডিরেক্টরি এবং তার সমস্ত উপ-ডিরেক্টরিগুলির বিষয়বস্তু পেতে পিএইচপি বা অন্যান্য ভাষায় আপনাকে কোডের কয়েকটি লাইন লিখতে হবে, তবে রুবিতে এটি 2 টি লাইন লাগে:
require 'find'
Find.find('./') do |f| p f end
এটি বর্তমান ডিরেক্টরি এবং এর সমস্ত উপ-ডিরেক্টরিগুলির সামগ্রী মুদ্রণ করবে।
বা আরও ছোট, আপনি ’**’
স্বরলিপিটি ব্যবহার করতে পারেন :
p Dir['**/*.*']
একই ফলাফল পেতে আপনি কতগুলি লাইন পিএইচপি বা জাভাতে লিখবেন?
যদিও ওয়ান লাইন সমাধান নয়, আমি মনে করি এটি রুবি কল ব্যবহার করে এটি করার সেরা উপায়।
প্রথমে সমস্ত ফাইলগুলি পুনরাবৃত্তভাবে
মুছুন দ্বিতীয়ত সমস্ত খালি ডিরেক্টরি মুছুন
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
এখানে একটি উদাহরণ যা দুর.glob এর সাথে একটি রেল প্রকল্প ডিরেক্টরি গতিশীল আবিষ্কারের সাথে সংযুক্ত করে:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
তবে সম্পদ ফোল্ডারের ভিতরে থাকা সাব-ফোল্ডার এবং ফাইলগুলি এখনও দেখতে পেলাম নাRails.application.config.assets.paths