(ruby)(コピペで使えるライブラリ集) パターンにマッチングしたファイルの一覧を配列で返すメソッド

ruby コピペライブラリ一覧→ http://morakana.hatenablog.jp/entry/2018/03/13/100032



この enum_files メソッドは、パターンにマッチングしたファイル名一覧を取得します


enum_files(['./*'])

で、マッチングしたファイルのファイル名が絶対パスの配列で返ってきます


パターンを複数個指定したい場合は、パターンを配列で指定します

enum_files(['./*.rb', './*.txt']) 



絶対パス以外の形式でファイル名を取得したい場合
第二引数にフォーマット文字列を指定することで戻り値をカスタマイズ出来ます
フォーマット文字は

a 絶対パス名
d ディレクトリ(絶対パス)まで
f ファイル名(拡張子を含む)
F ファイル名(拡張子を含まない)
e 拡張子のみ

の組み合わせで指定します
たとえば

enum_files(['./*.rb', './*.txt'], 'aFfe')

のようにすると、対応した各ファイルに対して
[<絶対パス名>, <ファイル名(拡張子を含まない)>, <ファイル名(拡張子を含む)>, <拡張子のみ>]
がセットされた配列の配列で返します
無効なフォーマット文字を入れた場合は nil が入ります


enum_filesメソッド定義

def enum_files(ptn, format = 'a')
	files = []
	Dir.glob(ptn, File::FNM_CASEFOLD).each{|i1|
		fullpath_name = File.expand_path(i1)
		file = []
		format.split('').each{|i2|
			file << (
				case i2
				when 'a'
					fullpath_name
				when 'd'
					File.dirname(fullpath_name)
				when 'f'
					File.basename(fullpath_name)
				when 'F'
					File.basename(fullpath_name, '.*')
				when 'e'
					File.extname(fullpath_name)
				else
					nil
				end
			)
		}
		files << file
	}
	return(files)
end



同等の機能で配列クラスを拡張するバージョンはこちら

class Array
	def enum_files(format = 'a')
		files = []
		Dir.glob(self, File::FNM_CASEFOLD).each{|i1|
			fullpath_name = File.expand_path(i1)
			file = []
			format.split('').each{|i2|
				file << (
					case i2
					when 'a'
						fullpath_name
					when 'd'
						File.dirname(fullpath_name)
					when 'f'
						File.basename(fullpath_name)
					when 'F'
						File.basename(fullpath_name, '.*')
					when 'e'
						File.extname(fullpath_name)
					else
						nil
					end
				)
			}
			files << file
		}
		return(files)
	end
end

配列にファイル検索パターンをセットしてから
配列のenum_filesインスタンスメソッドを実行します
引数はフォーマット文字列を指定します(省略可)

['./*.rb', './*.txt'].enum_files('aFfe')

で、上の例と同等の機能になります