我的目录结构如下:
/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"
]
谢谢。
答案 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)
}
}