有没有比Ruby的Dir.glob更快的替代品?

时间:2013-05-10 16:46:56

标签: ruby performance glob

我正在使用Dir.glob来访问与通配符模式匹配的所有文件集。

Dir.glob( '**/*.txt' ) { |file_name|
    parse file_name
}

因为这个glob调用是递归的,并且因为涉及大量文件,所以在块启动之前,glob需要很长时间来构建文件数组。

我想要的是一种访问所有相同文件的方法,但是在Ruby“发现”每个文件之后立即调用该块,以便立即处理第一个文件而不是在等待整个目录树之后完成搜索。

有这样的结构吗?

2 个答案:

答案 0 :(得分:4)

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

希望这可以帮到你。通过递归扩展模式来查找文件(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}

答案 1 :(得分:0)

您还可以使用findIO.popen

IO.popen("find . -name '*.txt'").each { |path| parse(path.chomp) }