1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| func CopyDir(src, dest string, exclude []string) error { src = filepath.Clean(src) dest = filepath.Clean(dest)
if _, err := os.Stat(dest); os.IsNotExist(err) { if err := os.MkdirAll(dest, os.ModePerm); err != nil { return err } }
return filepath.Walk(src, func(path string, info fs.FileInfo, err error) error { normalizedPath := filepath.Clean(path) fileName := strings.TrimPrefix(normalizedPath, src) fileName = strings.TrimPrefix(fileName, string(os.PathSeparator))
if fileName == "" { return nil } for _, e := range exclude { matched, err := filepath.Match(e, info.Name()) if err != nil { return err } if matched { return nil } } if info.IsDir() { return os.Mkdir(filepath.Join(dest, fileName), info.Mode()) } data, err := os.ReadFile(filepath.Join(src, fileName)) if err != nil { return err } return os.WriteFile(filepath.Join(dest, fileName), data, info.Mode()) }) }
|