blah blah

batch rename(python, go)

하위 디렉토리에 있는 파일까지 한번에 파일명 변경해야 되는 일은 자주 겪는 상황임에도 얼마나 정리 습관이 없는지 매번 스크립트 다시 짜곤 하는 것 같다 ㅜㅠ

우선 python 으로 짜보았고

import os
import re

pattern_str = "^test"
rename_str = "about"
ext_str = ".html"
work_dir = r"d:\Test\TEST\mren"

p = re.compile(pattern_str)
for (path, dir, files) in os.walk(work_dir):
    for filename in files:
        ext = os.path.splitext(filename)[-1]
        if ext == ext_str and p.match(filename):
            print("%s\%s => %s" % (path, filename, re.sub(pattern_str, rename_str, filename)))
            os.rename(os.path.join(path, filename), os.path.join(path, re.sub(pattern_str, rename_str, filename)))

공부 겸해서 go 로 엉성하게나마 짜보았다.

package main

import (
    "flag"
    "fmt"
    "os"
    "path/filepath"
    "regexp"
)

func renameFiles(path string, f os.FileInfo, err error) error {
    oldNameStr := "^test"
    newNameStr := "about"
    extStr := ".html"

    r, _ := regexp.Compile(oldNameStr)
    if fileName := f.Name(); !f.IsDir() && filepath.Ext(fileName) == extStr {
        if ok, _ := regexp.MatchString(oldNameStr, fileName); ok {
            r1 := regexp.MustCompile(fileName)
            newPath := r1.ReplaceAllString(path, r.ReplaceAllString(fileName, newNameStr))
            fmt.Println(newPath)
            err := os.Rename(path, newPath)

            if err != nil {
                fmt.Println(err)
                return err
            }

        }
    }

    return nil
}

func main() {
    flag.Parse()
    filepath.Walk(flag.Arg(0), renameFiles)
}

두 언어 다 기본 문법 겨우 아는 수준이라 뭔가 냄새가 나는데 어떻게 손댈지 엄두가 안나는 …

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s