У меня есть структура каталогов, которая выглядит так:
/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"
]
Спасибо.



Приведенная ниже функция будет рекурсивно проходить через каталог и возвращать пути ко всем файлам, имя которых соответствует заданному шаблону:
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 г.) вы можете использовать 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)
}
}