山本です。

「上からマッチ」「下からマッチ」があるとどの位便利か確かめるために、
アルファベットで始まるディレクトリを削除する関数を組み比べてみました。
(実行はしてないので、動かないかもしれません)

# Dir.foreach: 関数が2つ必要。"." ".." を除去するのを忘れがち。(速度は最も速い)

def rmdir(path)
    Dir.foreach(path) do |name| next if (name == "." || name == "..")
        child = path + "/" + name
        if File.directory?(child)
            rmdir(child)
        else
            File.delete(child)
        end
    end
    Dir.rmdir(path)
end

def rmdir2(path)
    Dir.foreach(path) do |name| next if (name == "." || name == "..")
        child = path + "/" + name
        if name =~ /^[a-Z].*/ && File.directory?(child)
            rmdir(child)
        end
    end
end

# Dir.glob: 柔軟だが、直感的とは言いがたい。glob処理にも無駄がある

def rmdir2(root)
    Dir.glob(root + "/**/[a-Z]*/").sort_by{|dir| dir.scan(%r[/]).size}.each do |dir|
        Dir.glob(dir + "**/").sort_by{|path| -path.scan(%r[/]).size}.each do |subdir|
            Dir.glob(subdir + "*") do |file|
                File.delete(path)
            end
            Dir.rmdir(subdir)
        end
    end
end

# Dir.glob nobu: 直感的。ただ、ファイルシステムに変更を加えながらglobしているのがどうか。

def rmdir2(root)
    Dir.glob(root + "/**/[a-Z]*/", Dir::GLOB_HEAD) do |dir|
        Dir.glob(dir + "**/", Dir::GLOB_TAIL) do |subdir|
            Dir.glob(subdir + "*") do |file|
                File.delete(file)
            end
            Dir.rmdir(subdir)
        end
    end
end

かなり便利そうだけど、こういった書き方ができるのかよくわからないというのが、正直な気持ちです。

でも開発版だし、コミットして試すスタンスでいいのかもしれません。ただ、

> デフォルトは最速(不定)で、
> Dir::GLOB_HEAD のような指定があれば「上からマッチ」
> Dir::GLOB_TAIL のような指定があれば「下からマッチ」

は、将来のことを考えると、この方がいいと思います。

**/に対するチェックも、とりあえず厳密にしたほうがいいと思います。