拡張子の大文字と小文字を区別せずに、特定の拡張子を持つ dir 内のすべてのファイルを取得します (拡張子は大文字と小文字を区別しません)。

概要

Rubyでは、拡張子の大文字と小文字に関係なく、特定の拡張子を持つディレクトリ内のすべてのファイルを取得する正しい方法は何ですか?

たとえば、ディレクトリ ~/myDir があり、そこに file1.JPG、file2.jpg、noFile.png、file3.jpg というファイルがあるとします。 jpgファイルだけを取得したいのですが。私が使用していたもの:

results = Dir[File.join(Dir.home, 'myDir', '*.jpg')].sort

しかし、これでは file1 が残ります。

ファイルを個別にチェックしながら、チェックする前に各ファイルを強制的に大文字にするようなハック的な解決策は望んでいません。拡張子が JPG、JPg、Jpg、jpg、jpG、および jPG のファイルを取得するような厄介なことは絶対に望んでいません。

古いバージョンとの下位互換性がない場合は、サポートされているバージョンを回答に含めてください。私は 1.9.3 を使用していますが、他の人は使用していない可能性があります。

解決策

Dir.glob を使用し、それに File::FNM_CASEFOLD を 2 番目のパラメータとして渡して、大文字と小文字を無視するように指示できます。したがって、次のようになります。

Dir.glob(File.join(Dir.home, 'myDir', "*.jpg"), File::FNM_CASEFOLD).sort

Derick Bailey がこの投稿について話しているこの投稿で、この解決策を見つけました。

すべてのバージョンで動作するかどうかはわかりませんが、知っている人がいたら教えてください。ここで更新します。この投稿の最後のリンクにある Trans は、「ドキュメントには ‘(so+File::FNM_CASEFOLD+ は無視されます)’ と書かれています」と言って、常にサポートされていたわけではないように見せています。