Ruby的Dir.glob是否有更快的替代方案?

9
我正在使用Dir.glob来访问与通配符模式匹配的所有文件集。
Dir.glob( '**/*.txt' ) { |file_name|
    parse file_name
}

因为这个glob调用是递归的,并且涉及到大量文件,所以在块开始之前,glob需要很长时间来构建文件数组。
我希望的是一种访问所有相同文件的方法,但是在Ruby“发现”每个文件后立即调用块,这样第一个文件会立即被处理,而不是等待整个目录树搜索完毕后才开始处理。
是否有这样的构造方式?

1
也许可以使用 Dir.foreach 并在块中使用模式?Find 模块也可能有用。 - squiguy
2个回答

4
您可以使用findIO.popen
IO.popen("find . -name '*.txt'").each { |path| parse(path.chomp) }

3

似乎没有内置的方法可以做到这一点。

希望这能帮到你。通过递归扩展模式查找文件(Ruby 1.9.3):

class Dir
   def self.glob_recursively( pattern, &block )
     begin
       glob(pattern, &block)
       dirs = glob('*').select { |f| File.directory? f }
       dirs.each do |dir|
         # Do not process symlink
         next if File.symlink? dir
         chdir dir
         glob_recursively(pattern, &block)
         chdir '..'
       end
     rescue SystemCallError => e
       # STDERR
       warn "ERROR: #{pwd} - #{e}"
     end
   end
end

Dir.glob_recursively ('*.txt') {|file| puts file}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接