13 func usage(retval int) {
14 fmt.Printf("directory_merge: moves files from multiple directories " +
15 "into a single directory\n");
16 fmt.Printf("usage: directory_merge [destination_directory] " +
17 "[source_dir 1] ... [source_dir N]\n")
21 type RenamePlan struct {
26 func (plan *RenamePlan) DstToString(numDigits int) string {
27 return fmt.Sprintf("%0" + fmt.Sprintf("%d", numDigits) + "d", plan.dstIdx);
30 func (plan *RenamePlan) String(dstDir string, numDigits int) string {
31 return plan.src + " -> " + dstDir + "/" + plan.DstToString(numDigits);
34 func (plan *RenamePlan) Execute(dstDir string, numDigits int) error {
35 dstFile := dstDir + "/" + plan.DstToString(numDigits)
36 fmt.Printf("Renaming %s to %s.\n", plan.src, dstFile)
37 err := os.Rename(plan.src, dstFile)
39 return errors.New(fmt.Sprintf("Failed to rename %s to %s: %v\n",
40 plan.src, dstFile, err.Error()))
46 if (len(os.Args) < 3) {
50 srcDirs := os.Args[2:]
51 renamePlans := make([]*RenamePlan, 0)
53 for srcDirIdx := range srcDirs {
54 // ioutil.ReadDir alphabetizes what it returns
55 srcDir := srcDirs[srcDirIdx]
56 srcs, err := ioutil.ReadDir(srcDir)
58 panic(fmt.Sprintf("Error reading directory %s: %s", srcDir, err))
60 for srcIdx := range srcs {
61 srcPath := srcDir + "/" + srcs[srcIdx].Name()
63 renamePlan := &RenamePlan {
67 renamePlans = append(renamePlans, renamePlan)
70 numDigits := int(math.Ceil(math.Log10(float64(dstIdx))))
71 for renamePlanIdx := range renamePlans {
72 fmt.Printf("%s\n", renamePlans[renamePlanIdx].
73 String(dstDir, numDigits));
75 reader := bufio.NewReader(os.Stdin)
77 fmt.Printf("Execute? (y/n):\n")
78 text, _ := reader.ReadString('\n')
79 text = strings.TrimSpace(text)
84 fmt.Printf("Aborting.\n");
88 for renamePlanIdx := range renamePlans {
89 err := renamePlans[renamePlanIdx].Execute(dstDir, numDigits);