为什么Ruby中的Dir.glob没有在用方括号命名的文件夹中看到文件?

我有这棵树:

. ├── folders │  ├── foo │  │  └── fuu.flac │  ├── foo [bar] │  │  └── fuu.flac │  └── foo[bar] │  └── fuu.flac └── test.rb 

和这个代码:

 #!/bin/env ruby ## encoding: utf-8 Dir.glob('./folders/*').each do |path| puts "Contents of #{path} :" Dir.glob(File.join(path, '*')).each do |file_path| puts "\t #{file_path}" end end 

我希望看到我的三个fuu.flac文件。 但是,该脚本不会显示名称中带有方括号的文件夹中的文件。

这是输出:

 Contents of ./folders/foo [bar] : Contents of ./folders/foo[bar] : Contents of ./folders/foo : ./folders/foo/fuu.flac 

这是Ruby的正常行为,还是我错过了什么?

(我在Ubuntu 12.10下使用Ruby 1.9.3)

方括号在壳体通配中具有特殊意义 。 foo[bar]匹配foobfooafooa ,但显然不是foo[bar] 。 如果你真的想动态地生成这样的模式,至少需要转义字符\?{}[]. 使用反斜杠:

 def escape_glob(s) s.gsub(/[\\\{\}\[\]\*\?]/) { |x| "\\"+x } end # ... Dir.glob("#{escape_glob(path)}/*").each do |file_path| # ... end