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