Lan*_*ard 94 ruby filesystems recursion
在Ruby中获取目录数组(不包括文件)的最快,最优化,单行方式是什么?
包含文件怎么样?
sep*_*p2k 172
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Run Code Online (Sandbox Code Playgroud)
而不是Dir.glob(foo)
你也可以写Dir[foo]
(但Dir.glob
也可以采取一个块,在这种情况下,它将产生每个路径,而不是创建一个数组).
Fel*_*peC 53
我相信这里的解决方案都不涉及隐藏目录(例如'.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Run Code Online (Sandbox Code Playgroud)
MBO*_*MBO 29
对于目录列表,请尝试
Dir['**/']
Run Code Online (Sandbox Code Playgroud)
文件列表更难,因为在Unix目录中也是一个文件,因此您需要测试类型或从返回列表中删除条目,该条目是其他条目的父级.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Run Code Online (Sandbox Code Playgroud)
并简单地列出所有文件和目录
Dir['**/*']
Run Code Online (Sandbox Code Playgroud)
只有目录
`find -type d`.split("\n")
Run Code Online (Sandbox Code Playgroud)
目录和普通文件
`find -type d -or -type f`.split("\n")`
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
如此处的其他答案所述,您可以使用Dir.glob
.请记住,文件夹中可能包含许多奇怪的字符,而glob参数是模式,因此某些字符具有特殊含义.因此,执行以下操作是不安全的:
Dir.glob("#{folder}/**/*")
Run Code Online (Sandbox Code Playgroud)
相反:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
Run Code Online (Sandbox Code Playgroud)