Вопрос

Как мне получить список папок, которые существуют в определенном каталоге с помощью ruby?

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}

Редактировать: Обновлено в соответствии с исправлением ScottD.

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

С помощью этого вы можете получить массив полный путь к вашему каталоги, подкаталоги, подкаталоги рекурсивным способом.Я использовал этот код, чтобы нетерпеливо загрузить эти файлы внутрь 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).Видишь документация для FileTest для получения дополнительной информации.

Мы можем объединить Ответ Борха и ответ Йоханнеса чтобы получить довольно элегантное решение для получения имен каталогов в папке.

# 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