Есть ли более быстрая альтернатива Dir.glob в Ruby?

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

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

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

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

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


person OldPeculier    schedule 10.05.2013    source источник
comment
Может быть, использовать Dir.foreach и использовать шаблон в блоке? Модуль Find также может быть полезен.   -  person squiguy    schedule 10.05.2013


Ответы (2)


Кажется, ни один встроенный способ не может этого сделать.

Надеюсь, это поможет вам. Поиск файлов путем рекурсивного расширения шаблона (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}
person zhongguoa    schedule 10.05.2013

Вы также можете использовать find и IO.popen

IO.popen("find . -name '*.txt'").each { |path| parse(path.chomp) }
person ZogStriP    schedule 18.11.2018