Який найшвидший, найбільш оптимізований однолінійний спосіб отримати масив каталогів (крім файлів) у Ruby?
Як щодо включення файлів?
Який найшвидший, найбільш оптимізований однолінійний спосіб отримати масив каталогів (крім файлів) у Ruby?
Як щодо включення файлів?
Відповіді:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Замість цього Dir.glob(foo)
ви також можете писати Dir[foo]
(однак Dir.glob
також можете взяти блок, і в цьому випадку він отримає кожен шлях замість створення масиву).
Dir.glob("**/")
якщо ви також не хочете посилань
File::FNM_DOTMATCH
прапор.
Dir.glob("**/*", File::FNM_DOTMATCH)
Я вважаю, що жодне з вирішень тут не стосується прихованих каталогів (наприклад, '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Мені було корисно
Список каталогів спробуйте
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)
end.select {}.flatten()
частину? Мені подобається функція в цілому. Схоже, це створить масив масивів? Чи можна було б виконати elseif
частину за допомогою: rec_path(child, file) << child.to_s
щоб ви могли призначити її масиву та отримати масив рядків? Дякую!
Як зазначено в інших відповідях тут, ви можете використовувати Dir.glob
. Майте на увазі, що в папках може бути багато дивних символів, а аргументи глобуса є зразками, тому деякі символи мають особливі значення. Таким чином, небезпечно робити щось на зразок наступного:
Dir.glob("#{folder}/**/*")
Замість цього робіть:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
У PHP або інших мовах, щоб отримати вміст каталогу та всіх його підкаталогів, потрібно написати рядки коду, але в Ruby це потрібно 2 рядки:
require 'find'
Find.find('./') do |f| p f end
це надрукує вміст поточного каталогу та всіх його підкаталогів.
Або коротше: Ви можете використовувати ’**’
позначення:
p Dir['**/*.*']
Скільки рядків ви напишете на PHP або на Java, щоб отримати однаковий результат?
Хоча це не однолінійне рішення, я думаю, що це найкращий спосіб зробити це за допомогою рубінних дзвінків.
Спочатку видаліть усі файли рекурсивно
Друге видаліть усі порожні каталоги
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Ось приклад, що поєднує динамічне відкриття каталогу проекту Rails з Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, але все ще не міг побачити підпапки та файли у папці активівRails.application.config.assets.paths