Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "flag"
- "io/ioutil"
- "log"
- "os"
- "path"
- "path/filepath"
- "sort"
- "strconv"
- "strings"
- "time"
- )
- var (
- // flags
- root string
- limit int
- pad int
- order string
- // operation vars
- folder = 1
- )
- type fileInfo struct {
- path string
- modTime time.Time
- }
- func initFlags() {
- rootPtr := flag.String("root", ".", "Root directory")
- limitPtr := flag.Int("limit", 100, "Max files per folder")
- padPtr := flag.Int("pad", 4, "Pad zeroes until length")
- orderPtr := flag.String("order", "date", "How to order files, possible values: date, name")
- flag.Parse()
- root = *rootPtr
- limit = *limitPtr
- order = *orderPtr
- pad = *padPtr
- }
- func getFiles(limit int) []fileInfo {
- ret := []fileInfo{}
- // filepath.
- fi, err := ioutil.ReadDir(root)
- check(err)
- for _, info := range fi {
- if info.IsDir() {
- continue
- }
- curInfo := fileInfo{
- path: path.Join(root, info.Name()),
- modTime: info.ModTime(),
- }
- ret = append(ret, curInfo)
- }
- if len(ret) == 0 {
- return ret
- }
- sort.SliceStable(ret, func(i, j int) bool {
- if order == "name" {
- return strings.Compare(ret[i].path, ret[j].path) < 0
- }
- return ret[i].modTime.Unix() < ret[j].modTime.Unix()
- })
- return ret[:min(len(ret), limit)]
- }
- func check(err error) {
- if err != nil {
- panic(err)
- }
- }
- func min(a ...int) int {
- if len(a) == 0 {
- return 0
- }
- ret := a[0]
- for _, v := range a[1:] {
- if v < ret {
- ret = v
- }
- }
- return ret
- }
- func padZero(num, length int) string {
- numStr := strconv.Itoa(num)
- for length > len(numStr) {
- numStr = "0" + numStr
- }
- return numStr
- }
- func main() {
- initFlags()
- files := getFiles(limit)
- for len(files) > 0 {
- for _, fi := range files {
- dir, _ := filepath.Abs(filepath.Dir(fi.path))
- targetDir := filepath.Join(dir, padZero(folder, pad))
- log.Println("Creating target:", targetDir)
- _ = os.Mkdir(targetDir, 0644)
- target := filepath.Join(targetDir, filepath.Base(fi.path))
- log.Println("Moving file", fi.path, "to", target)
- check(os.Rename(fi.path, target))
- }
- folder++
- files = getFiles(limit)
- }
- }
Add Comment
Please, Sign In to add comment