如何在Go中使用双星球?

tcu*_*rdt 6 glob go

似乎Go是少数语言之一,似乎不理解文件globbing的双星("globstar")语法.至少这似乎没有按预期工作:

filepath.Glob(dir + "/**/*.bundle/*.txt")
Run Code Online (Sandbox Code Playgroud)

我错过了有关filepath实施的内容吗?是否有一个图书馆支持这个?

tcu*_*rdt 5

filepath.Glob实现使用filepath.Match引擎盖下。原来的规格没有涵盖非常常见的(.gitignorezsh)双星模式。绝不相同-但对于我的用例,我设法通过以下小功能解决了该问题:

func glob(dir string, ext string) ([]string, error) {

  files := []string{}
  err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
    if filepath.Ext(path) == ext {
      files = append(files, path)
    }
    return nil
  })

  return files, err
}
Run Code Online (Sandbox Code Playgroud)

我仍然愿意通过适当的双星匹配来更好地实施。

  • @Leahcim:`[] string {}`是一个切片字面量,在功能上等效于make([] string,0)`。 (3认同)

Dav*_*ray 5

我编写了一个支持双星通配符的小型扩展库。有了这个目录结构:

$ find a
a
a/b
a/b/c.d
a/b/c.d/e.f
Run Code Online (Sandbox Code Playgroud)

您可以使用它a/**/*.*来匹配目录下a包含点的所有内容,如下所示:

$ find a
a
a/b
a/b/c.d
a/b/c.d/e.f
Run Code Online (Sandbox Code Playgroud)

哪个输出:

$ go run example.go
MATCH: [a/b/c.d]
MATCH: [a/b/c.d/e.f]
Run Code Online (Sandbox Code Playgroud)