singleton method File.fnmatch

fnmatch(pattern, path, flags = 0) -> bool[permalink][rdoc]
fnmatch?(pattern, path, flags = 0) -> bool

ファイル名のパターンマッチ fnmatch(3) を行います。 path が pattern にマッチすれば真を返します。そうでない場合には false を返します。

[PARAM] pattern:
パターンを文字列で指定します。ワイルドカードとして `*', `?', `[]', `{}' が使用できます。 Dir.glob とは違って `**/' は使用できません。
    %w(foo foobar bar).each {|f|
      p File.fnmatch("foo*", f)
    }
    # => true
         true
         false
[PARAM] path:
パスを表す文字列を指定します。
[PARAM] flags:
パターンマッチの動作を以下で述べる定数の論理和で指定します。 flags のデフォルト値は0(フラグ指定なし)です。

引数 flags に指定できる定数は以下のとおりです。これらの定数は File::Constants で定義されていますが、 File クラスの親クラスの IO が File::Constants をインクルードしているので、これらの定数は File::FNM_NOESCAPE などとして参照可能です。

FNM_NOESCAPE

エスケープ文字 `\' を普通の文字とみなします。

デフォルトでは \ を伴う任意の文字はその文字にマッチしますが、このフラグをつけると、\ が普通の文字として扱われます。

  p File.fnmatch('\a', 'a')                       # => true
  p File.fnmatch('\a', '\a', File::FNM_NOESCAPE)  # => true

前者で * は、エスケープされているので "*" そのものにマッチします。

  p File.fnmatch('\*', 'a')                       # => false
  p File.fnmatch('\*', '\a', File::FNM_NOESCAPE)  # => true

単体の \ は、このフラグの有無に関わらず \ にマッチします。 (シングルクォート文字列中では \\ は、\ であることに注意)

  p File.fnmatch('\\', '\\')                      # => true
  p File.fnmatch('\\', '\\', File::FNM_NOESCAPE)  # => true
FNM_PATHNAME

ワイルドカード `*', `?', `[]' が `/' にマッチしなくなります。シェルのパターンマッチにはこのフラグが使用されています。

  p File.fnmatch('*', '/', File::FNM_PATHNAME)   # => false
  p File.fnmatch('?', '/', File::FNM_PATHNAME)   # => false
  p File.fnmatch('[/]', '/', File::FNM_PATHNAME) # => false
FNM_CASEFOLD

アルファベットの大小文字を区別せずにパターンマッチを行います。

  p File.fnmatch('A', 'a', File::FNM_CASEFOLD)   # => true
FNM_DOTMATCH

ワイルドカード `*', `?', `[]' が先頭の `.' にマッチするようになります。

  p File.fnmatch('*', '.', File::FNM_DOTMATCH)           # => true
  p File.fnmatch('?', '.', File::FNM_DOTMATCH)           # => true
  p File.fnmatch('[.]', '.', File::FNM_DOTMATCH)         # => true
  p File.fnmatch('foo/*', 'foo/.', File::FNM_DOTMATCH)   # => true
FNM_EXTGLOB

{} 内のコンマで区切られた文字列の組合せにマッチするようになります。例えば、foo{a,b,c} は fooa, foob, fooc に展開されそれぞれに対してマッチ判定を行います。

括弧は入れ子にすることができます。例えば、 {foo,bar{foo,bar}} は foo, barfoo, barbar のそれぞれにマッチします。

  p File.fnmatch('foo{a,b,c}', 'fooa', File::FNM_EXTGLOB)           # => true
  p File.fnmatch('{foo,bar{foo,bar}}', 'barfoo', File::FNM_EXTGLOB) # => true