单线程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] != '.' } 

点返回零,使用紧凑