Techioz Blog

Ruby の fnmatch が FNM_PATHNAME を持つサブディレクトリ内のファイルと一致しないのはなぜですか?

概要

Gitlab CI はグロブに次のコードを使用します。

File.fnmatch?(glob, path, File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB)

ディレクトリ内のすべてのファイルとフォルダーを一致させたい場合は、これを行う必要があると思います。

foo/*
foo/**/*

それは最悪だ。これはうまくいくと思いました:

foo/**

ただし、FNM_PATHNAME がない場合のみ機能します。これに関する Ruby ドキュメントは非常に悪いです。ここで一体何が起こっているのでしょうか? foo/a と foo/a/b に一致する単一のパターンはありますか?

解決策

foo/**/* は、FNM_PATHNAME がある場合にのみ foo/a と一致することがわかりました。