ওয়ান-লাইনার রুবিতে পুনরাবৃত্তভাবে ডিরেক্টরি তালিকা করতে?


98

রুবিতে ডিরেক্টরিগুলি (ফাইলগুলি বাদে) পাওয়ার জন্য দ্রুত, সর্বাধিক অনুকূল, ওয়ান-লাইনার উপায় কী?

কিভাবে ফাইল অন্তর্ভুক্ত সম্পর্কে?


4
দ্রুততম, সর্বাধিক অনুকূলিতকরণ এবং ওয়ান-লাইনার পাঠযোগ্য / রক্ষণাবেক্ষণের সাথে মতবিরোধে থাকতে পারে। এবং, আপনি একটি বেঞ্চমার্ক এবং দ্রুত পরীক্ষার সাহায্যে এটি সন্ধান করতে পারেন।
টিন ম্যান

উত্তর:


181
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files

পরিবর্তে Dir.glob(foo)আপনি এটিও লিখতে পারেন Dir[foo](তবে Dir.globএকটি ব্লকও নিতে পারেন, সেক্ষেত্রে এটি অ্যারে তৈরি করার পরিবর্তে প্রতিটি পাথ উত্পন্ন করবে)।

রুবি গ্লোব ডক্স


10
Dir.glob("**/")আপনি सिিমলিংক না চাইলে ব্যবহার করুন
জোহনেস

6
লুকানো ফাইল এবং ডিরেক্টরি সম্পর্কে কি?
অ্যালেডিয়াফেরিয়া

6
ম্যাচের ফলাফলগুলিতে ডটফাইলগুলি অন্তর্ভুক্ত করতে File::FNM_DOTMATCHপতাকাটি ব্যবহার করুন ।
এক্স-ইউরি

4
ধন্যবাদ @ এক্স-ইউরি! পতাকা Dir.glob("**/*", File::FNM_DOTMATCH)
বিটিডব্লিউটি এইভাবে

4
এখানে ডকুমেন্টেশনটি রয়েছে: রুবি
ডোক.আর.অর্গ.কোয়ার

53

আমি বিশ্বাস করি যে এখানে সমাধানগুলির কোনওটিই লুকানো ডিরেক্টরিগুলি (যেমন '.টেস্ট') ব্যবহার করে না:

require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }

Find.find('/tmp').collect {|_|_}আমার জন্য সহায়ক
আলেকজান্ডার বার্ড

সন্ধান করো থেকে সতর্ক থাকুন, এটা symlinks অনুসরণ না: stackoverflow.com/questions/3974087/...
leebutts

31

ডিরেক্টরি তালিকার জন্য চেষ্টা করুন

Dir['**/']

ফাইলগুলির তালিকা শক্ত, কারণ ইউনিক্স ডিরেক্টরিতেও একটি ফাইল, সুতরাং আপনাকে টাইপ করার জন্য পরীক্ষা করতে হবে বা ফেরত তালিকা থেকে প্রবেশকারীদের অপসারণ করতে হবে যা অন্যান্য এন্ট্রিগুলির প্যারেন্ট।

Dir['**/*'].reject {|fn| File.directory?(fn) }

এবং সমস্ত ফাইল এবং ডিরেক্টরি তালিকার জন্য সহজভাবে

Dir['**/*']

মনে রাখবেন যে তিনি বলেছিলেন "কেবল ফাইলগুলিও অন্তর্ভুক্ত রয়েছে", "কেবল ফাইলগুলি" নয় যাতে আপনাকে ডিরেক্টরিগুলি সরানোর প্রয়োজন হয় না।
sepp2k

4
@ sepp2k হ্যাঁ, আমি যখন আইআরবি নিয়ে খেলছিলাম তখন এই অংশটি আমি মিস করেছি। তবে আমি এটিকে এখানে রেখে দিচ্ছি যদি কেউ অনুরূপ কোনও
কিছুর

7

দ্রুত একটি লাইনার

কেবল ডিরেক্টরিগুলি

`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)

4
মিথ্যা: Dir.glob ("# {প্রত্যক্ষ} / ** / * /") map মানচিত্র {| ডিরেক্টরি | Pathname.new (ডিরেক্টরি)}
রবার্ট রস

কেউ কি end.select {}.flatten()অংশটি ব্যাখ্যা করতে পারেন ? আমি সামগ্রিকভাবে ফাংশন পছন্দ করি। দেখে মনে হচ্ছে এটি অ্যারের একটি অ্যারে তৈরি করবে? এর elseifসাথে অংশটি করা কি সম্ভব হবে : rec_path(child, file) << child.to_sযাতে আপনি এটি একটি অ্যারেতে নির্ধারণ করতে পারেন এবং স্ট্রিংগুলির একটি অ্যারে পেতে পারেন? ধন্যবাদ!
এমসিপি

7

এখানে অন্যান্য উত্তরে উল্লিখিত হিসাবে, আপনি ব্যবহার করতে পারেন Dir.glob। মনে রাখবেন যে ফোল্ডারগুলির মধ্যে প্রচুর অদ্ভুত অক্ষর থাকতে পারে এবং গ্লোব আর্গুমেন্টগুলি নিদর্শন, তাই কিছু অক্ষরের বিশেষ অর্থ রয়েছে। এই হিসাবে, নিম্নলিখিতগুলির মতো কিছু করা অনিরাপদ:

Dir.glob("#{folder}/**/*")

পরিবর্তে করুন:

Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }

2

ডিরেক্টরি এবং তার সমস্ত উপ-ডিরেক্টরিগুলির বিষয়বস্তু পেতে পিএইচপি বা অন্যান্য ভাষায় আপনাকে কোডের কয়েকটি লাইন লিখতে হবে, তবে রুবিতে এটি 2 টি লাইন লাগে:

require 'find'
Find.find('./') do |f| p f end

এটি বর্তমান ডিরেক্টরি এবং এর সমস্ত উপ-ডিরেক্টরিগুলির সামগ্রী মুদ্রণ করবে।

বা আরও ছোট, আপনি ’**’স্বরলিপিটি ব্যবহার করতে পারেন :

p Dir['**/*.*']

একই ফলাফল পেতে আপনি কতগুলি লাইন পিএইচপি বা জাভাতে লিখবেন?


14
Mustap.com/rubyzone_post_162_recursive-directory- তালিকা থেকে সোর্স উদ্ধৃত না করে সরাসরি কপি-পেস্টিংয়ের জন্য অগ্রাহ্য করা হয়েছে ...
একাজা

@ কিভেট্রস আমি লিঙ্কটির আর্কাইভ সংস্করণ অন্তর্ভুক্ত করার জন্য উত্তরটি সম্পাদনা করেছি :-)
ওব্রী

0

যদিও ওয়ান লাইন সমাধান নয়, আমি মনে করি এটি রুবি কল ব্যবহার করে এটি করার সেরা উপায়।

প্রথমে সমস্ত ফাইলগুলি পুনরাবৃত্তভাবে
মুছুন দ্বিতীয়ত সমস্ত খালি ডিরেক্টরি মুছুন

Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }

4
সে / সে ফাইল / ডিরেক্টরি মুছতে চায় না।
দারেক নডজা

একক লাইনে উভয় ফাইল + ডিরেক্টরিতে এটি কীভাবে করবেন?
vipin8169

0

এখানে একটি উদাহরণ যা দুর.glob এর সাথে একটি রেল প্রকল্প ডিরেক্টরি গতিশীল আবিষ্কারের সাথে সংযুক্ত করে:

dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))

আমি এটি চেষ্টা করেছি >> config.assets.paths << Rails.root.join("app", "assets", "*")তবে সম্পদ ফোল্ডারের ভিতরে থাকা সাব-ফোল্ডার এবং ফাইলগুলি এখনও দেখতে পেলাম নাRails.application.config.assets.paths
vipin8169

-1
Dir.open(Dir.pwd).map { |h| (File.file?(h) ? "#{h} - file" : "#{h} - folder") if h[0] != '.' }

বিন্দু শূন্য ফিরে, কমপ্যাক্ট ব্যবহার


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