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
これですかね?
コメントする