2015-12-08 4 views
0

У меня есть структура каталогов, например, как это:Использование подстановочных знаков в Dir.chdir - ruby?

+SOURCE_CODE 
      + MODULE_A 
      -myfile.txt 
      + MODULE_B 
      -myfile.txt 
      + MODULE_C 
      -myfile.txt 

Теперь я хотел бы сделать «Dir.chdir» в каждый из этих каталогов (MODULE_A, MODULE_B) и чем открыть «myfile.txt» где я, чем работать со строками в этих файлах. Это должно быть что-то вроде этого:

Dir.chdir "../SOURCE_CODE/MODULE_*/" 
    File.open("myfile.txt") do |f| 
    f.each_line do |line| 
     ...... 

Я знаю, что это не представляется возможным использовать групповые символы с «Dir.chdir». Но есть ли альтернативный путь?

ответ

1

Вы можете использовать групповые символы с Dir.glob:

Dir.glob("../SOURCE_CODE/MODULE_*/myfile.txt") do |filename| 
    File.open(filename) do |f| 
    f.each_line do |line| 
     # ... 
    end 
    end 
end 

Вы можете сделать все, что вы хотите внутри блока:

Dir.glob("../SOURCE_CODE/MODULE_*/") do |dirname| 
    Dir.chdir(dirname) 

    File.open("myfile.txt") do |f| 
    f.each_line do |line| 
     # ... 
    end 
    end 
end 

Возможно, вам потребуется указать абсолютный путь до Dir.glob для Dir.chdir работать должным образом; Я не уверен. File.expand_path удобен для этого.

+0

Thx, но это действительно альтернатива Dir.chdir? Моя идея - перейти в каталог, где существует «myfile, txt» и выполнить мой скрипт оттуда. У меня есть относительные пути в «myfile.txt», которые неправильно интерпретируются. – JohnDoe

+0

Вы можете использовать 'Dir.glob' в сочетании с' Dir.chdir' (или любым другим методом, который получает путь). Я отредактировал свой ответ, чтобы включить пример. –

+0

THX для идеи с соединением! оно работает! :) – JohnDoe

0

вы можете использовать Pathname класс, чтобы пройти через структуру каталогов

a = Pathname.new('/sourcecode') 
a.children.each do |child1| 
    child1.children.do |child2| 
    if child2.file 
     File.open(child2) do |f| 
     f.each_line do |line| 
     ... 
    end 
    end 
end 
Смежные вопросы