package main import ( "fmt" "log" "os" ) func main() { // TODO: Replace with cli arg parsing. // Directory to be sorted media_dir := "media/" // A destination directory of sorted files sorted_media_dir := fmt.Sprintf("sorted_%s", media_dir) // Get a list of the files in the directory to be sorted files, err := os.ReadDir(media_dir) if err != nil { log.Fatal(err) } // Make the destination directory err = os.Mkdir(sorted_media_dir, 0755) if err != nil && !os.IsExist(err) { log.Fatalf("Couldn't create sorted files directroy: %v", err) } // Iterate through the list of files for _, file := range files { // Don't try to sort directories if file.IsDir() { continue } // The name string of the file we're looking at current_file_name := file.Name() // Grab file info current_file, err := os.Stat(fmt.Sprintf("%s%s", media_dir, current_file_name)) if err != nil { log.Fatalf("Couldn't stat current file: %v", err) } // Save the last modified year and month current_file_year := current_file.ModTime().Year() current_file_month := current_file.ModTime().Month() // Make directories for the sorted files to go into err = os.Mkdir(fmt.Sprintf("%s%d", sorted_media_dir, current_file_year), 0755) if err != nil && !os.IsExist(err) { log.Fatalf("Couldn't create new directory: %v", err) } new_directory_path := fmt.Sprintf("%d/%02d/", current_file_year, current_file_month) err = os.Mkdir(fmt.Sprintf("%s%s", sorted_media_dir, new_directory_path), 0755) if err != nil && !os.IsExist(err) { log.Fatalf("Couldn't create new directory: %v", err) } // Debug output of last modified year/month, and the file name log.Default().Println(fmt.Sprintf("%d/%02d | %s", current_file_year, current_file_month, current_file_name)) // Set the current file path and the destination file path full_current_file_path := fmt.Sprintf("%s%s", media_dir, current_file_name) full_new_file_path := fmt.Sprintf("%s%s%s", sorted_media_dir, new_directory_path, current_file_name) // Move the file err = os.Rename(full_current_file_path, full_new_file_path) } }