我如何在 Go 中找到所有具有特定扩展名的文件,而不考虑深度?

How do I find all files that have a certain extension in Go, regardless of depth?

我的目录结构如下所示:

/root
  /folder_1
    file_name_1.md
  /folder_2
    file_name_2.md
  /folder_3
    file_name_3.md
  /folder_4
    /sub_folder_1
      file_name_4_1.md
    file_name_4.md

是否有 glob 函数可用于获取包含 .md 个文件的文件路径的数组?

例如:

[
  "/root/folder_1/file_name_1.md",
  "/root/folder_2/file_name_2.md",
  "/root/folder_3/file_name_3.md",
  "/root/folder_4/sub_folder_1/file_name_4_1.md",
  "/root/folder_4/file_name_4.md"
]

谢谢。

下面的函数将递归遍历一个目录和return所有名称与给定模式匹配的文件的路径:

func WalkMatch(root, pattern string) ([]string, error) {
    var matches []string
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if info.IsDir() {
            return nil
        }
        if matched, err := filepath.Match(pattern, filepath.Base(path)); err != nil {
            return err
        } else if matched {
            matches = append(matches, path)
        }
        return nil
    })
    if err != nil {
        return nil, err
    }
    return matches, nil
}

用法:

files, err := WalkMatch("/root/", "*.md")

从 Go 1.16(2021 年 2 月)开始,您可以使用 filepath.WalkDir 获得更好的效果 表现:

package main

import (
   "io/fs"
   "path/filepath"
)

func find(root, ext string) []string {
   var a []string
   filepath.WalkDir(root, func(s string, d fs.DirEntry, e error) error {
      if e != nil { return e }
      if filepath.Ext(d.Name()) == ext {
         a = append(a, s)
      }
      return nil
   })
   return a
}

func main() {
   for _, s := range find("/root", ".md") {
      println(s)
   }
}

https://golang.org/pkg/path/filepath#WalkDir