Как найти все файлы с определенным расширением в Go независимо от их глубины? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть структура каталогов, которая выглядит следующим образом:

/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"
]

Спасибо.

1 Ответ

3 голосов
/ 22 марта 2019

Функция ниже будет рекурсивно проходить через каталог и возвращать пути ко всем файлам, чье имя соответствует заданному шаблону:

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