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

3 つの 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

角括弧は、シェルのグロビングのコンテキストで特別な意味を持ちます。、またはにfoo[bar]一致しますが、明らかに一致しません。このようなパターンを動的に生成したい場合は、少なくともバックスラッシュを使用して文字をエスケープする必要があります。foobfooafoorfoo[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 に答える