如何在Go中查找具有特定扩展名的所有文件,而不论深度如何?

时间:2019-03-22 12:57:12

标签: arrays file go file-io glob

我的目录结构如下:

/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

是否可以使用全局函数来获取包含.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"
]

谢谢。

2 个答案:

答案 0 :(得分:3)

下面的函数将递归遍历目录,并将路径返回到名称与给定模式匹配的所有文件:

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")

答案 1 :(得分:1)

从 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