سؤال

كيف يمكنني الحصول على قائمة بالمجلدات الموجودة في دليل معين باستخدام روبي؟

Dir.entries() يبدو قريبًا ولكني لا أعرف كيفية قصره على المجلدات فقط.

هل كانت مفيدة؟

المحلول

الأردن قريب، ولكن Dir.entries لا يعيد المسار الكامل File.directory? تتوقع. جرب هذا:

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

نصائح أخرى

لقد وجدت هذا أكثر فائدة وسهلة الاستخدام:

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.

إذا كنت تريد أن يكون لديك سلاسل

Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }

لو directory_name كانت مطلقة، وهذه السلاسل مطلقة أيضًا.

العثور بسهولة على جميع المجلدات تحت دليل معين:

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

نسخة غير متكررة:

Dir.glob 'certain_directory/*/'

ملحوظة: Dir.[] يعمل مثل Dir.glob.

يمكنك استخدام File.directory? من FileTest الوحدة النمطية لمعرفة ما إذا كان الملف دليل. الجمع بين هذا مع Dir.entries يجعل لطيفة واحدة (العش) -

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

يحرر: تحديث تصحيح سكوت.

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

مع هذا واحد، يمكنك الحصول على صفيف مسار كامل لك الدلائل, الدلائل الفرعية, sercubdirectories. بطريقة متكررة. اعتدت هذا الكود الحريص تحميل هذه الملفات في الداخل config/application ملف.

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

بالإضافة إلى ذلك، لا نحتاج إلى التعامل مع الممل . و .. أي أكثر من ذلك. الإجابة المقبولة اللازمة للتعامل معها.

Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
$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))

هذا سيعمل مع مسارات مثل ~/*/ (جميع المجلدات داخل الدليل الرئيسي الخاص بك).

المجلدات فقط ('.' و '..' مستبعدون):

Dir.glob(File.join(path, "*", File::SEPARATOR))

المجلدات والملفات:

Dir.glob(File.join(path, "*"))

أعتقد أنه يمكنك اختبار كل ملف لمعرفة ما إذا كان دليلا مع FileTest.directory? (file_name). وبعد يرى الوثائق للحصول على filletest لمزيد من المعلومات.

يمكننا الجمع إجابة بورح و إجابة يوهانس للحصول على حل أنيق تماما للحصول على أسماء الدليل في مجلد.

# 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 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top