2

我有这棵树:

.
├── 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)

4

1 回答 1

4

方括号在 shell globbing 的上下文中具有特殊的含义foo[bar]匹配foobfooafoor,但显然不是foo[bar]。如果您真的想动态生成这样的模式,您至少需要\?{}[].使用反斜杠转义字符:

def escape_glob(s)
  s.gsub(/[\\\{\}\[\]\*\?]/) { |x| "\\"+x }
end

# ...
Dir.glob("#{escape_glob(path)}/*").each do |file_path|
  # ...
end
于 2013-01-02T18:43:13.697 回答