diff --git a/go-file-sort.go b/go-file-sort.go index ea3bdad..e93f944 100644 --- a/go-file-sort.go +++ b/go-file-sort.go @@ -1,26 +1,46 @@ package main import ( + "flag" "fmt" "log" "os" + "path/filepath" ) func main() { - // TODO: Replace with cli arg parsing. - // Directory to be sorted - media_dir := "media/" - // A destination directory of sorted files + // Add directory specification flag with default value + sort_dir := flag.String("d", "media/", "Specify the directory of files to be sorted.") + flag.Parse() + + // Make sure the input directory is valid + _, err := os.Stat(*sort_dir) + if err != nil { + log.Fatalf("A valid directory was not given: %v", err) + } + + // Get the absolute path of the directory to be sorted + media_dir_path, err := filepath.Abs(*sort_dir) + if err != nil { + log.Fatalf("Couldn't grab absolute filepath: %v", err) + } + + // Make name for the destination directory of sorted files + media_dir := filepath.Base(media_dir_path) sorted_media_dir := fmt.Sprintf("sorted_%s", media_dir) + sorted_media_dir_path := fmt.Sprintf("%s/%s", filepath.Dir(media_dir_path), sorted_media_dir) + + // Debug output of the filepaths + log.Default().Println(fmt.Sprintf("%s | %s | %s | %s", media_dir_path, media_dir, sorted_media_dir_path, sorted_media_dir)) // Get a list of the files in the directory to be sorted - files, err := os.ReadDir(media_dir) + files, err := os.ReadDir(media_dir_path) if err != nil { log.Fatal(err) } // Make the destination directory - err = os.Mkdir(sorted_media_dir, 0755) + err = os.Mkdir(sorted_media_dir_path, 0755) if err != nil && !os.IsExist(err) { log.Fatalf("Couldn't create sorted files directroy: %v", err) } @@ -28,14 +48,14 @@ func main() { // Iterate through the list of files for _, file := range files { // Don't try to sort directories - if file.IsDir() { + if file.IsDir() || file.Name() == ".gitkeep" { 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)) + current_file, err := os.Stat(fmt.Sprintf("%s/%s", media_dir_path, current_file_name)) if err != nil { log.Fatalf("Couldn't stat current file: %v", err) } @@ -45,13 +65,13 @@ func main() { 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) + err = os.Mkdir(fmt.Sprintf("%s/%d", sorted_media_dir_path, 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) + new_directory_path := fmt.Sprintf("%d/%02d", current_file_year, current_file_month) + err = os.Mkdir(fmt.Sprintf("%s/%s", sorted_media_dir_path, new_directory_path), 0755) if err != nil && !os.IsExist(err) { log.Fatalf("Couldn't create new directory: %v", err) } @@ -60,8 +80,8 @@ func main() { 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) + full_current_file_path := fmt.Sprintf("%s/%s", media_dir_path, current_file_name) + full_new_file_path := fmt.Sprintf("%s/%s/%s", sorted_media_dir_path, new_directory_path, current_file_name) // Move the file err = os.Rename(full_current_file_path, full_new_file_path)