package tasks import ( "fmt" "io" "io/fs" "os" "path/filepath" "time" "github.com/rwcarlsen/goexif/exif" ) type ImageSortTask struct{} func (t *ImageSortTask) Run(folderPath string) error { return filepath.WalkDir(folderPath, func(path string, d fs.DirEntry, err error) error { return visit(folderPath, path, d, err) }) } func visit(basePath, path string, di fs.DirEntry, err1 error) error { fmt.Printf("Visited: %s\n", path) if di.IsDir() { if path == basePath { return nil } return fs.SkipDir } f, err := os.Open(path) if err != nil { return err } x, err := exif.Decode(f) if err != nil { return err } dateTag, err := x.Get(exif.DateTime) if err != nil { return err } dateVal, err := dateTag.StringVal() if err != nil { return err } if dateVal == "0000:00:00 00:00:00" { return nil } date, err := time.Parse("2006:01:02 15:04:05", dateVal) if err != nil { return err } f.Close() newFolderName := fmt.Sprintf("%04d.%02d", date.Year(), date.Month()) if err := os.MkdirAll(filepath.Join(basePath, newFolderName), os.ModePerm); err != nil { return err } if err := os.Rename(path, filepath.Join(basePath, newFolderName, filepath.Base(path))); err != nil { return err } //copy(path, filepath.Join(basePath, newFolderName, filepath.Base(path))) return nil } func copy(src, dst string) (int64, error) { sourceFileStat, err := os.Stat(src) if err != nil { return 0, err } if !sourceFileStat.Mode().IsRegular() { return 0, fmt.Errorf("%s is not a regular file", src) } source, err := os.Open(src) if err != nil { return 0, err } defer source.Close() destination, err := os.Create(dst) if err != nil { return 0, err } defer destination.Close() nBytes, err := io.Copy(destination, source) return nBytes, err }