我正在使用Dir.glob来访问与通配符模式匹配的所有文件集。
Dir.glob( '**/*.txt' ) { |file_name|
parse file_name
}
因为这个glob调用是递归的,并且因为涉及大量文件,所以在块启动之前,glob需要很长时间来构建文件数组。
我想要的是一种访问所有相同文件的方法,但是在Ruby“发现”每个文件之后立即调用该块,以便立即处理第一个文件而不是在等待整个目录树之后完成搜索。
有这样的结构吗?
答案 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)
您还可以使用find
和IO.popen
IO.popen("find . -name '*.txt'").each { |path| parse(path.chomp) }