单线程recursion列出Ruby中的目录?
什么是最快,最优化,单线程的方式来获取Ruby中的目录(不包括文件)的数组?
如何包含文件?
Dir.glob("**/*/") # for directories Dir.glob("**/*") # for all files
而不是Dir.glob(foo)
你也可以写Dir[foo]
(但是Dir.glob
也可以占用一个block,在这种情况下,它会产生每个path而不是创build一个数组)。
我相信这里的解决scheme都不涉及隐藏的目录(例如'.test'):
require 'find' Find.find('.') { |e| puts e if File.directory?(e) }
对于目录列表尝试
Dir['**/']
文件列表比较困难,因为在Unix目录中也是一个文件,所以你需要testingtypes或从返回列表中删除条目,这是其他条目的父代。
Dir['**/*'].reject {|fn| File.directory?(fn) }
并为所有文件和目录列表简单
Dir['**/*']
快一个class轮
只有目录
`find -type d`.split("\n")
目录和正常文件
`find -type d -or -type f`.split("\n")`
纯美丽的ruby
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) } }
虽然不是一个单一的解决scheme,我认为这是使用ruby调用的最好方法。
首先recursion删除所有文件
其次删除所有空目录
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file } Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
在PHP或其他语言中,要获取目录及其所有子目录的内容,必须编写一些代码行,但在Ruby中需要2行代码:
require 'find' Find.find('./') do |f| pf end
这将打印当前目录及其所有子目录的内容。
或更短,您可以使用'**'
符号:
p Dir['**/*.*']
你会用PHP或Java编写多less行来获得相同的结果?
下面是一个dynamic发现Rails项目目录和Dir.glob的例子:
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] != '.' }
点返回零,使用紧凑