我如何在 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)
}
}
我的目录结构如下所示:
/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)
}
}