我有一个相对于根目录的文件路径列表,正在尝试确定与glob模式匹配的路径。我正在尝试获得相同的结果,如果所有文件都在我的文件系统上,并且我从根目录运行Dir.glob(<my_glob_pattern>)。
如果这是文件路径列表:
foo/index.md
foo/bar/index.md
foo/bar/baz/index.md
foo/bar/baz/qux/index.md这是glob模式:
foo/bar/*.md如果这些文件存在于我的文件系统中,Dir.glob('foo/bar/*.md')将只返回foo/bar/index.md。
glob docs提到了fnmatch,我尝试使用它,但发现模式foo/bar/*.md匹配任何数量的嵌套子目录中的.md文件,这与Dir.glob('foo/bar/**/*.md')类似,而不仅仅是foo/bar目录的直接子目录:
my_glob = 'foo/bar/*.md'
filepaths = [
'foo/index.md',
'foo/bar/index.md',
'foo/bar/baz/index.md',
'foo/bar/baz/qux/index.md',
]
# Using the provided filepaths
filepaths_that_match_pattern = filepaths.select{|path| File.fnmatch?(my_glob, path)}.sort
# If the filepaths actually existed on my filesystem
filepaths_found_by_glob = Dir.glob(my_glob).sort
raise Exception.new("They don't match!") unless filepaths_that_match_pattern == filepaths_found_by_glob我错误地期望上面的代码可以工作,但filepaths_found_by_glob只包含直接的子对象,而filepaths_that_match_pattern也包含所有嵌套的子对象。
如果我的文件系统上没有文件路径,我如何才能获得与Dir.glob相同的结果?
发布于 2021-12-15 11:56:04
您可以在调用File.fnmatch函数时使用标志File::FNM_PATHNAME。因此您的函数调用将如下所示- File.fnmatch(pattern, path, File::FNM_PATHNAME)
您可以在此处查看与其用法相关的示例:https://apidock.com/ruby/File/fnmatch/class
https://stackoverflow.com/questions/61111160
复制相似问题