<commit_before>package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
)

// TODO エラーメッセージの多言語化

func glob(dir string) ([]string, error) {
	files, err := filepath.Glob(dir + string(filepath.Separator) + "[^.]*")
	if err != nil {
		return nil, err
	}
	return files, nil
}

func extractDirname(filename, delimiter string) string {
	a := strings.Split(filename, delimiter)
	if a[0] == filename {
		return ""
	}
	return a[0]
}

//func mkDir(dname string, ignoreCase bool) error {

//}

func move(dname, fname string) error {
	//ディレクトリ作成、すでにディレクトリかファイルがある場合エラーになるので、エラーは無視する
	// TODO ignore caseをどうやったら実現できるか？
	_ = os.Mkdir(dname, 0755)

	newName := filepath.Join(dname, string(filepath.Separator), filepath.Base(fname))
	//ディレクトリにファイル移動
	if err := os.Rename(fname, newName); err != nil {
		return err
	}

	return nil
}

func main() {
	var dir string
	var delimiter string
	var help bool
	//var ignoreCase bool

	//コマンドラインオプション解析
	// デリミタ
	flag.StringVar(&delimiter, "d", " - ", "a delimiter which separates filenames into two parts")
	flag.BoolVar(&help, "h", false, "show help")
	//flag.StringBool(&ignoreCase, "ignore case", false, "ignore case of dir names")
	flag.Parse()

	if help {
		flag.PrintDefaults()
		os.Exit(0)
	}
	// 対象ディレクトリ
	if args := flag.Args(); len(args) > 0 {
		dir = args[0]
	} else {
		dir = "./"
	}
	fmt.Printf("dir = %+v\n", dir)
	fmt.Printf("delimiter = %+v len='%+v'\n", delimiter, len(delimiter))

	if len(delimiter) == 0 {
		fmt.Println("delimiter cannot be empty.")
		os.Exit(0)
	}

	//ファイルリスト一覧取得
	files, err := glob(dir)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("files = %+v\n", files)

	for _, f := range files {
		//fmt.Printf("v = %+v\n", f)
		//デリミタでファイル名を前後に分割、デリミタが見つからなければ何もしない
		dname := extractDirname(f, delimiter)
		//fmt.Printf("dname = %+v\n", dname)
		if dname == "" {
			continue
		}

		if err := move(dname, f); err != nil {
			log.Fatalf("error %v", err)
		}

	}

}<commit_msg>add help<commit_after>package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"strings"
)

// TODO エラーメッセージの多言語化

func glob(dir string) ([]string, error) {
	files, err := filepath.Glob(dir + string(filepath.Separator) + "[^.]*")
	if err != nil {
		return nil, err
	}
	return files, nil
}

func extractDirname(filename, delimiter string) string {
	a := strings.Split(filename, delimiter)
	if a[0] == filename {
		return ""
	}
	return a[0]
}

//func mkDir(dirName string, ignoreCase bool) (string, error) {
//path, dir := filepath.Split(dname)

////pathのディレクトリ一覧
////小文字にして比較

//}

func move(dirName, fileName string) error {
	//ディレクトリ作成、すでにディレクトリかファイルがある場合エラーになるので、エラーは無視する
	// TODO ignore caseをどうやったら実現できるか？
	_ = os.Mkdir(dirName, 0755)

	newName := filepath.Join(dirName, string(filepath.Separator), filepath.Base(fileName))
	//ディレクトリにファイル移動
	if err := os.Rename(fileName, newName); err != nil {
		return err
	}

	return nil
}

func main() {
	var dir string
	var delimiter string
	var help bool
	var ignoreCase bool
	var confirmation bool
	var fileonly bool

	//コマンドラインオプション解析
	// デリミタ
	flag.StringVar(&delimiter, "d", " - ", "a delimiter which separates filenames into two parts")
	flag.BoolVar(&help, "h", false, "show help")
	flag.BoolVar(&ignoreCase, "i", false, "ignore case of dir names")
	flag.BoolVar(&confirmation, "c", false, "show a confirmation before moving files")
	flag.BoolVar(&fileonly, "f", false, "move only files")
	flag.Parse()

	if help {
		fmt.Println("\ngather - a simple utility to move files\n")
		fmt.Println("Usage: gather [options] target_dir")
		fmt.Println("Options:")
		flag.PrintDefaults()
		os.Exit(0)
	}
	// 対象ディレクトリ
	if args := flag.Args(); len(args) > 0 {
		dir = args[0]
	} else {
		dir = "./"
	}

	if len(delimiter) == 0 {
		fmt.Println("delimiter cannot be empty.")
		os.Exit(0)
	}

	//ファイルリスト一覧取得
	files, err := glob(dir)
	if err != nil {
		log.Fatal(err)
	}

	for _, f := range files {
		//デリミタでファイル名を前後に分割、デリミタが見つからなければ何もしない
		dirName := extractDirname(f, delimiter)
		if dirName == "" {
			continue
		}

		if err := move(dirName, f); err != nil {
			log.Fatalf("error %v", err)
		}
	}
}
{'fraction_non_alphanumeric': 0.1628020502806932, 'fraction_numerical': 0.005369782767878936, 'mean_word_length': 3.6409966024915064, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1471776', 'n_tokens_mistral': 1864, 'n_tokens_neox': 1786, 'n_words': 390}