Какова самая быстрая, наиболее оптимизированная, острота способ получить массив каталогов (исключая файлы) в Ruby?
Как насчет включения файлов?
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Вместо Dir.glob (foo)
вы также можете написать Dir [foo]
(однако Dir.glob
также может принимать блок , и в этом случае он будет давать каждый путь вместо создания массива).
В PHP или других языках, чтобы получить содержимое каталога и всех его подкаталогов, вам нужно написать несколько строк кода, но в Ruby требуется 2 строки:
require 'find'
Find.find('./') do |f| p f end
это распечатает содержимое текущего каталога и все его подкаталоги.
Или короче: вы можете использовать обозначение '**'
:
p Dir['**/*.*']
Сколько строк вы напишете на PHP или на Java, чтобы получить тот же результат?
Для списка каталогов попробуйте
Dir['**/']
Список файлов сложнее, потому что в Unix каталог также является файлом, поэтому вам нужно проверить тип или удалить записи из возвращенного списка, который является родительским для других записей.
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)