[Ruby][shell] **/ と */ の違い。

そうそう先日RSpec + RCov でテストしたい。 その2 - 日々此妄想を書いててちょっとハマったのでメモしとく


最近よく見掛ける **/ なんだこれ?

  • lib/**/*.rb とか
  • app/**/*.rb とか

何か再起的に下りてってくれる気がするんだけど。。。

$ ls ~/work/**/*.rb |wc -l
54
$ ls ~/work/*/*.rb |wc -l
54

結果は一緒。


しかも。

$ ls doc/*/*
/bin/ls: doc/*/*: No such file or directory
$ ls doc/**/*
/bin/ls: doc/**/*: No such file or directory

なんか期待してるのと違うんだよなぁ。。。

こんな動きだっけ???


しかも * とか ** って google とかで検索しにくい。
さんざん調べた(つもり)だけどやっぱりわからん。



で、ひょっとして。。。。 と思ってみたものは Ruby の Dir.glob のリファレス

**/
ワイルドカード */ の0回以上の繰り返しを意味し、ディレクトリを再帰的にたどってマッチを行います。例えば,foo/**/bar は foo/bar, foo/*/bar,foo/*/*/bar ... (以下無限に続く)に対してそれぞれマッチ判定を行います。

あう。shellの機能じゃなかったのか。。。Rubyの機能か。。。どうりで最近よくみるわけだ。。。


一応確認

$ irb
irb(main):001:0> Dir.glob('doc/*/*')
=> []
irb(main):002:0> Dir.glob('doc/**/*')
=> ["doc/README_FOR_APP"]
irb(main):003:0> 

満足した。