Dir.globでシンボリックリンクをたどってくれない件

| コメント(0) | トラックバック(0)

OSXです。他のプラットフォームは試してません(・ω・)

例えばこんなディレクトリ構成で

$ tree .
.
├── a
│   ├── 1.rb
│   └── b
│       ├── 2.rb
│       ├── c
│       │   └── 3.rb
│       └── x -> ../../x
└── x
    └── y
        └── 4.rb

$ rvm use ruby-2.0.0-p247
$ ruby -e 'puts Dir.glob("a/**/*.rb")'
a/1.rb
a/b/2.rb
a/b/c/3.rb

ホントはa/b/x/y/4.rbも入って欲しい(・ω・)

StackOverflowにこんな事が書いてあった。

http://stackoverflow.com/questions/357754/can-i-traverse-symlinked-directories-in-ruby-with-a-glob

Dir.glob("**/*/**/*.rb")は、とてもいいかんじだけど、

$ ruby -e 'puts Dir.glob("a/**/*/**/*.rb")'
a/b/2.rb
a/b/c/3.rb
a/b/x/y/4.rb

$ ruby -e 'puts Dir.glob("a/b/**/*/**/*.rb")'
a/b/c/3.rb
a/b/x/y/4.rb

ここまではいいとして、次の場合はcの下が見つかって欲しい。

$ ruby -e 'puts Dir.glob("a/b/c/**/*/**/*.rb")'

次だと見つかるので。

$ ruby -e 'puts Dir.glob("a/b/c/**/*.rb")'
a/b/c/3.rb

次は惜しいけど重複して見つかる場合がある。

$ ruby -e 'puts Dir.glob("a/**{,/*/**}/*.rb")'
a/1.rb
a/b/2.rb
a/b/c/3.rb
a/b/2.rb
a/b/c/3.rb
a/b/x/y/4.rb


$ ruby -e 'puts Dir.glob("a/b/c/**{,/*/**}/*.rb")'
a/b/c/3.rb

uniqすれば期待通りの結果。

$ ruby -e 'puts Dir.glob("a/**{,/*/**}/*.rb").uniq'
a/1.rb
a/b/2.rb
a/b/c/3.rb
a/b/x/y/4.rb

$ ruby -e 'puts Dir.glob("a/b/c/**{,/*/**}/*.rb").uniq'
a/b/c/3.rb

MRIじゃないけどRubinusでこんなIssueを見つけた。
https://github.com/rubinius/rubinius/pull/2481

今(2013/08/21)からひと月前にmasterにマージされてます。ちょっと試す。

$ rvm install rbx -n master
$ rvm use rbx-head-master
$ ruby -e 'puts Dir.glob("a/**/*.rb")'
a/1.rb
a/b/2.rb
a/b/c/3.rb

あれ?変わらない(-ω-)

まぁRubinusでできたとしても実際には利用できないのでいいんですけど。

今のところベストプラクティスは

Dir.glob("**{,/*/**}/*.rb").uniq

これですかね?



トラックバック(0)

トラックバックURL: http://www.iwazer.com/mt/mt-tb.cgi/1440

コメントする

このブログ記事について

このページは、iwazerが2013年8月21日 08:56に書いたブログ記事です。

ひとつ前のブログ記事は「Homebrewのちょっと前のFormulaを使うときにハマった」です。

次のブログ記事は「RubyMotionのREPLでプログラムで使用していない定数を参照」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。