読者です 読者をやめる 読者になる 読者になる

Grepコマンドもどき ver.1

 Railsで「この変数はどこで定義されているんだ?」と困ったときに、ディレクトリ以下のファイルすべてでパターンマッチをしたいです。なので、Grepコマンドもどきを作ってみました。

require 'find'

def grep(pattern, directory)
  Find.find(directory) do |path|
    if FileTest.file?(path)
      file = open(path)
      while line = file.gets
        puts "#{path}: #{file.lineno}" if line =~ pattern
      end
      file.close
    end
  end
end

grep(Regexp.new(ARGV[0]), ARGV[1])

実行結果

C:\codes\ruby>ruby grep.rb @task c:\codes\rails\rails_apps\task
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 3
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 8
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 13
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 17
c:\codes\rails\rails_apps\task/app/views/admin/tasks/new.html.erb: 5
c:\codes\rails\rails_apps\task/app/views/admin/tasks/index.html.erb: 8
c:\codes\rails\rails_apps\task/app/views/admin/tasks/edit.html.erb: 5
c:\codes\rails\rails_apps\task/app/views/admin/tasks/edit.html.erb: 26
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 16
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 20
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 27
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 31
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 37
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 43
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 46
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 48
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 49
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 52
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 60
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 63
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 65
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 69
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 77
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 78

 ご覧の通り、修正しなきゃいけないのは出力するパス名が絶対パスになっているというところです。引数に渡したパスに対して相対パスにしたい。
 でも、なんかうまくいかないんですよね。例えば

path = path.sub(Regexp.new(directory), '')

を加えてもダメでした。うまくいくと思ったんですが。

 なぜダメなのか、そして何かいいアイディアがありましたら、お願いします。