山本です。

>思い付きですが、Dir#globというメソッドはどうでしょうか。例えば、
>Dir.open(dir).glob("**/*.rb") とすると dir/**/*.rb が、dirから
>の相対パスで返されるようなイメージです。

すみません、今 File.fnmatch で頭がいっぱいなので、
私は議論に参加できそうにありません。

ただ、

  Dir.chdir(dir) do
    Dir.glob("**/*.rb") do |path|
      # 処理
    end
  end

ではだめなんでしょうか?