Ruby 有没有一种简单的方法来模拟Dir::glob?
我有一个文件名列表,我想在上面实现它 我认为这很容易,因为有一个看起来是正确的工具。但是,在某些情况下,这两种方法的行为不同:Ruby 有没有一种简单的方法来模拟Dir::glob?,ruby,Ruby,我有一个文件名列表,我想在上面实现它 我认为这很容易,因为有一个看起来是正确的工具。但是,在某些情况下,这两种方法的行为不同: # Given a directory layout like this: # + # |-- file # |-+ folder # | |-- file # gives ['file','folder/file'] Dir.glob('**/file') # gives ['folder/file'] ['file','folder','folder/file
# Given a directory layout like this:
# +
# |-- file
# |-+ folder
# | |-- file
# gives ['file','folder/file']
Dir.glob('**/file')
# gives ['folder/file']
['file','folder','folder/file'].select{|n| File.fnmatch?('**/file', n) }
在斜杠前面加上前缀可以解决这一问题,但会引入另一个问题:
# gives ['file,'folder/file']
['file','folder','folder/file'].select{|n| File.fnmatch?('**/file','/'+n) }
# gives an empty array, but should give 'file' and 'folder' like Dir.glob does.
['file','folder','folder/file'].select{|n| File.fnmatch?('f*','/'+n) }
是否有人已经解决了这个问题,或者我必须执行一些Regexp Magic(tm)?不确定这是否适用于所有情况,但是**文件(不带斜杠)似乎与您的两个测试用例都匹配:
['file', 'folder', 'folder/file'].select {|n| File.fnmatch?('**file', n) }
尝试传递
文件::FNM\u路径名
标志
['file','folder','folder/file'].select{|n| File.fnmatch?('**/file', n,File::FNM_PATHNAME) }
=> ["file", "folder/file"]
这似乎给出了您想要的。您需要点a
FNM\u路径名
标志
> ['file','folder','folder/file'].select{|n| File.fnmatch?('**/file', n, File::FNM_PATHNAME) }
=> ["file", "folder/file"]
> ['file','folder','folder/file'].select{|n| File.fnmatch?('f*',n, File::FNM_PATHNAME) }
=> ["file", "folder"]
嗨,我希望我能把“正确答案”分开。谢谢你的帮助!