2013-05-10 14 views
8

Dir.globを使用して、ワイルドカードパターンに一致するすべてのファイルのセットを参照しています。RubyのDir.globに代わるより速い方法がありますか?

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

このグロブコールが再帰的とファイルの多くが関与しているためであるので、グロブはブロックが始まる前に、ファイルの配列を構築するために長い時間がかかります。

代わりに同じファイルをすべて訪問する方法がありますが、Rubyが各ファイルを「発見」した直後にブロックを呼び出して、最初のファイルがディレクトリツリー全体を待ってからすぐに処理されるようにします検索を終了します。

このような構造はありますか?

+1

ブロックでパターンを使用するのはおそらく 'Dir.foreach'ですか? Findモジュールも使用可能です。 – squiguy

答えて

4

これを組み込むことはできないようです。

これがあなたを助けてくれることを願っています。再帰的にパターンを拡張してファイルを検索する:

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} 
関連する問題