我有这棵树:
. ├── 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]
匹配foob
, fooa
或fooa
,但显然不是foo[bar]
。 如果你真的想动态地生成这样的模式,至少需要转义字符\?{}[].
使用反斜杠:
def escape_glob(s) s.gsub(/[\\\{\}\[\]\*\?]/) { |x| "\\"+x } end # ... Dir.glob("#{escape_glob(path)}/*").each do |file_path| # ... end