9 ответов:
Dir.glob("**/*/") # for directories Dir.glob("**/*") # for all filesвместо
Dir.glob(foo)вы можете также написатьDir[foo](вместе сDir.globтакже можно взять блок, и в этом случае он будет давать каждый путь вместо создания массива).
Я считаю, что ни одно из решений здесь не имеет дело со скрытыми каталогами (например,'.тест'):
require 'find' Find.find('.') { |e| puts e if File.directory?(e) }
для списка каталогов попробуйте
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)
как отмечено в других ответах здесь, вы можете использовать
Dir.glob. Имейте в виду, что в папках может быть много странных символов, а аргументы 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, чтобы получить тот же результат?
хотя это не однолинейное решение, я думаю, что это лучший способ сделать это с помощью вызовов ruby.
Сначала удалите все файлы рекурсивно
Во-вторых удалить все пустые каталогиDir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file } Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
вот пример, который сочетает в себе динамическое обнаружение каталога проекта Rails с Dir.Глоб:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
Dir.open(Dir.pwd).map { |h| (File.file?(h) ? "#{h} - file" : "#{h} - folder") if h[0] != '.' }точки возвращают ноль, используйте compact
Comments