Як отримати список папок, які існують у певному каталозі з ruby?
Dir.entries()
виглядає близько, але я не знаю, як обмежити лише папки.
Як отримати список папок, які існують у певному каталозі з ruby?
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.
Якщо ви хочете мати рядки
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Якщо directory_name
було абсолютним, ці рядки теж абсолютним.
Pathname
тому , що він автоматично видаляє .
, ..
і proprietery файли , такі як.DS_Store
Рекурсивно знаходити всі папки в певному каталозі:
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)) }
Редагувати: оновлено відповідно до виправлення ScottD.
З цим, ви можете отримати масив на повний шлях до вашим каталогом , підкаталоги , рекурсивно рекурсивним чином. Я використовував цей код, щоб охоче завантажувати ці файли всередину 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))
Це буде працювати з такими шляхами, як ~/*/
(усі папки у вашому домашньому каталозі).
Ми можемо об'єднати відповідь Borh в і відповідь Йоханнеса отримати досить елегантне рішення , щоб отримати імена каталогів в папці.
# 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 .
'.'
(поточний каталог) та'..'
(батьківський поточний каталог). У більшості випадків потрібно видалити принаймні ці два.