在Linux下的Ruby中不区分大小写打开一个文件

有没有办法打开一个文件在Linux下的Ruby不区分大小写? 例如,给定stringfoo.txt ,我可以打开文件FOO.txt

一种可能的方法是读取目录中的所有文件名,并手动search所需文件的列表,但我正在寻找更直接的方法。

Solutions Collecting From Web of "在Linux下的Ruby中不区分大小写打开一个文件"

虽然你不能open大小写不敏感,你可以编写目录搜索你很简洁的建议。 例如

 filename = Dir.glob('foo.txt', File::FNM_CASEFOLD).first if filename # use filename here else # no matching file end 

请注意,虽然文档建议FNM_CASEFOLD不能与glob一起使用,但这看起来不正确或过时。

备择方案

如果您担心使用FNM_CASEFOLD则可以使用FNM_CASEFOLD几种方法:

 filename = Dir.glob('*').find { |f| f.downcase == 'foo.txt' } 

或者写一个方法来为给定的文件名建立一个不区分大小写的glob:

 def ci_glob(filename) glob = '' filename.each_char do |c| glob += c.downcase != c.upcase ? "[#{c.downcase}#{c.upcase}]" : c end glob end irb(main):024:0> ci_glob('foo.txt') => "[fF][oO][oO].[tT][xX][tT]" 

然后你可以这样做:

 filename = Dir.glob(ci_glob('foo.txt')).first 

您可以使用带有FNM_CASEFOLD标志的FNM_CASEFOLD来获取除了大小写之外的与给定名称匹配的所有文件名的列表。 然后,您可以首先使用结果数组来获取任何结果,或者使用min_by获得与orignial的情况最接近的匹配结果。

 def find_file(f) Dir.glob(f, File::FNM_CASEFOLD).min_by do |f2| f.chars.zip(f2.chars).count {|c1,c2| c1 != c2} end end system "touch foo.bar" system "touch Foo.Bar" Dir.glob("FOO.BAR", File::FNM_CASEFOLD) #=> ["foo.bar", "Foo.Bar"] find_file("FOO.BAR") #=> ["Foo.Bar"]