2013-05-10 2 views
8

Я использую Dir.glob для посещения набора всех файлов, соответствующих шаблону подстановочных знаков.Есть ли более быстрая альтернатива Ruby's Dir.glob?

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

Поскольку этот Глоб вызов рекурсивный и потому, что много файлов участвуют, Глоб занимает много времени, чтобы построить массив файлов перед запуском блока.

То, что я хочу вместо этого, - это способ посещения всех тех же файлов, но вызов блока сразу после того, как Ruby «обнаруживает» каждый файл, так что первый файл обрабатывается сразу же, а не после ожидания всего дерева каталогов чтобы закончить поиск.

Есть ли такая конструкция?

+1

Возможно, используйте 'Dir.foreach' и используйте шаблон в блоке? Может также использоваться модуль Find. – squiguy

ответ

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} 
Смежные вопросы