山本です。 「上からマッチ」「下からマッチ」があるとどの位便利か確かめるために、 アルファベットで始まるディレクトリを削除する関数を組み比べてみました。 (実行はしてないので、動かないかもしれません) # 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 のような指定があれば「下からマッチ」 は、将来のことを考えると、この方がいいと思います。 **/に対するチェックも、とりあえず厳密にしたほうがいいと思います。