2013-05-10 22 views
8

Joker desenle eşleşen tüm dosyaların kümesini ziyaret etmek için Dir.glob kullanıyorum. Ruby's Dir.glob'a daha hızlı bir alternatif var mı?

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

bu glob çağrısı özyinelemelidir ve dosyaların çok katılmaktadırlar çünkü glob blok başlamadan önce dosyaların dizinin oluşturulması uzun zaman alır Çünkü

.

Bunun yerine, aynı dosyaların tümünü ziyaret etmenin bir yolu olduğunu, ancak Ruby'nin her dosyayı bulduktan hemen sonra bloğu çağırmasını, böylece ilk dosyanın tüm dizin ağacını bekledikten sonra hemen işlenmesini sağlamasıdır aranarak bitirmek için.

Böyle bir yapı var mı?

+1

Belki de 'Dir.foreach' komutunu kullanın ve blokta bir desen kullanın? Bul modülü de kullanılabilir. – squiguy

cevap

4

Bunu yapmak için yerleşik bir yol yok gibi görünüyor.

Bu yardımcı olabilir umarım. Desenleri art arda genişleterek dosyaları bulun (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} 
İlgili konular