Skip to content

Instantly share code, notes, and snippets.

@devlights
Created August 9, 2019 10:15
Show Gist options
  • Save devlights/306c47ace86afec6dc9cd0fa85a474e3 to your computer and use it in GitHub Desktop.
Save devlights/306c47ace86afec6dc9cd0fa85a474e3 to your computer and use it in GitHub Desktop.
[go] 指定されたディレクトリ下にあるファイル名のoldをnewに置換してリネーム
package main
import (
"flag"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
)
var (
baseDir string
verbose bool
)
// Rename は、指定されたディレクトリ下にあるファイル名のoldをnewに置換してリネームします
func Rename(dir, old, new string) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
return err
}
for _, file := range files {
if file.IsDir() {
continue
}
curName := file.Name()
newName := strings.ReplaceAll(curName, old, new)
logf("\t%q ==> %q", curName, newName)
curPath := filepath.Join(dir, curName)
newPath := filepath.Join(dir, newName)
if err := os.Rename(curPath, newPath); err != nil {
return err
}
}
return nil
}
func logf(format string, v ...interface{}) {
if verbose {
log.Printf(format, v...)
}
}
func main() {
var (
oldPattern string
newPattern string
recursive bool
)
flag.StringVar(&baseDir, "path", ".", "Target directory")
flag.StringVar(&oldPattern, "old", "", "Old pattern")
flag.StringVar(&newPattern, "new", "", "New pattern")
flag.BoolVar(&recursive, "r", false, "Perform recursively")
flag.BoolVar(&verbose, "v", false, "Output verbose log messages")
flag.Parse()
if recursive {
err := filepath.Walk(baseDir, func(p string, info os.FileInfo, e error) error {
if e != nil {
log.Fatal(e)
}
if info.IsDir() {
logf("Enter [%s]", p)
if renameErr := Rename(p, oldPattern, newPattern); renameErr != nil {
return renameErr
}
}
return nil
})
if err != nil {
log.Fatal(err)
}
} else {
if err := Rename(baseDir, oldPattern, newPattern); err != nil {
log.Fatal(err)
}
}
os.Exit(0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment