2013-05-10 6 views
8

Używam Dir.glob do odwiedzenia zestawu wszystkich plików pasujących do wzorca wieloznacznego.Czy jest szybsza alternatywa dla Dir.glob Ruby?

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

Ponieważ to wywołanie glob jest rekurencyjne i dlatego biorą udział wiele plików, glob zajmuje dużo czasu, aby zbudować tablicę plików przed rozpoczęciem blokowych.

Tym, czego chcę, to sposób odwiedzenia wszystkich tych samych plików, ale wywołanie bloku natychmiast po tym, jak Ruby "odkryje" każdy plik, tak aby pierwszy plik był przetwarzany od razu, a nie po czekaniu na całe drzewo katalogów aby zakończyć wyszukiwanie.

Czy istnieje taka konstrukcja?

+1

Może użyć 'Dir.foreach' i użyć wzorca w bloku? Moduł Wyszukiwania może być również użyteczny. – squiguy

Odpowiedz

4

Wygląda na to, że nie można tego zrobić w sposób wbudowany.

Mam nadzieję, że to może ci pomóc. Znajdź pliki, rozwijając rekurencyjnie wzór (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}