新井です。

> こんばんは。久野です。

> <http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Dir>では,
> '**'は「ディレクトリを再帰的にたどって*のマッチを行います」
> とあります。これを見て,'**'を指定すれば再帰的にすべてのファ
> イルがたどれると思いこんでしまいました。少し説明が分かりにく
> いように思うのですが,どうでしょうか。(と責任転嫁してみる。)

あー、すみません。私が zsh 使ったことなく、マニュアルも見ず、
ソースも見ずに思い込みで書いたせいですね。はい、勘違いしてお
りました。

で、ちょっと zsh インストールして man を見たところ

    "**/" はパターン "*/" の0回以上の繰り返し

のようですね。だから

    $ mkdir -p foo/foo/foo
    $ ruby -e 'Dir.glob("**/foo").each {|v| p v}'

は、

    "./foo"
    "foo/foo"
    "foo/foo/foo"

となるようで。。って、あれ?最初の "." はなに?これだと"**"が"."
にマッチしたように見えます。見えても良いような気もしますが、
ちょっと、いや結構気持悪いです。はい。


--- dir.c.org	Mon Feb 19 22:53:33 2001
+++ dir.c	Wed Feb 28 05:01:40 2001
@@ -631,7 +631,7 @@
 		if (m && strcmp(magic, "**") == 0) {
 		    recursive = 1;
 		    buf = ALLOC_N(char, strlen(base)+strlen(m)+3);
-		    sprintf(buf, "%s%s%s", base, (*base)?"":".", m);
+		    sprintf(buf, "%s%s", base, *base ? m : m+1);
 		    rb_glob_helper(buf, flag, func, arg);
 		    free(buf);
 		}

--
新井康司 (Koji Arai)