Skip to content

Instantly share code, notes, and snippets.

@lheyberger
Last active August 29, 2015 14:20
Show Gist options
  • Save lheyberger/d6b5ec85fc95825cd268 to your computer and use it in GitHub Desktop.
Save lheyberger/d6b5ec85fc95825cd268 to your computer and use it in GitHub Desktop.
timestamper
package main
import (
"fmt"
"github.com/rwcarlsen/goexif/exif"
"io/ioutil"
"log"
"os"
"path/filepath"
"sort"
"strconv"
)
func GetKey(fname string) (string, error) {
f, err := os.Open(fname)
if err != nil {
return "", err
}
defer f.Close()
x, err := exif.Decode(f)
if err != nil {
return "", err
}
tm, err := x.DateTime()
if err != nil {
return "", err
}
layout := "20060102150405"
return tm.Format(layout), err
}
func main() {
if len(os.Args) < 3 {
return
}
path := os.Args[1]
//prefix := os.Args[2]
if err := os.Chdir(path); err != nil {
log.Fatal(err)
}
files, err := ioutil.ReadDir(".")
if err != nil {
log.Fatal(err)
}
// Sort files alphabetically
filenames := make([]string, 0, len(files))
for _, f := range files {
filenames = append([]string{f.Name()}, filenames...)
}
sort.Strings(filenames)
// Sort files by generated key (useful to deal with images shot in burst mode)
newFilenamesMap := make(map[string][]string)
for _, filename := range filenames {
if newName, err := GetKey(filename); err == nil {
if _, ok := newFilenamesMap[newName]; !ok {
newFilenamesMap[newName] = make([]string, 0)
}
newFilenamesMap[newName] = append(newFilenamesMap[newName], filename)
}
}
// Rename files appending an _<index> if necessary
for key, filenames := range newFilenamesMap {
if l := len(filenames); l > 1 {
for i, filename := range filenames {
newName := key + "_" + strconv.Itoa(i+1) + filepath.Ext(filename)
fmt.Println("Renamed", newName, "was", filename)
os.Rename(filename, newName)
}
} else {
newName := key + filepath.Ext(filenames[0])
fmt.Println("Renamed", newName, "was", filenames[0])
os.Rename(filenames[0], newName)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment