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

img*_*x64 13 ruby linux case-insensitive

有没有办法在Linux下在Ruby中不区分大小写地打开文件?例如,给定字符串foo.txt,我可以打开文件FOO.txt吗?

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

mik*_*kej 18

虽然你不能不open区分大小写,但你可以非常简洁地编写你建议的目录搜索.例如

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

请注意,虽然文档表明FNM_CASEFOLD不能与glob一起使用,但这似乎不正确或已过时.

备择方案

如果您担心使用,FNM_CASEFOLD那么有几种选择:

filename = Dir.glob('*').find { |f| f.downcase == 'foo.txt' }
Run Code Online (Sandbox Code Playgroud)

或者写一个小方法来为给定的文件名构建一个不区分大小写的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]"
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

filename = Dir.glob(ci_glob('foo.txt')).first
Run Code Online (Sandbox Code Playgroud)

  • 对于大多数`IO`和`File`方法,Ruby只是将所有内容传递给libc.所以,我想这可能基本上随机工作或不工作,具体取决于操作系统的libc如何工作. (2认同)