CLIで同名ファイルがある場合を連番付与するGo製コマンドを作成する

コンピュータ

PowerShellでコピーコマンドなどで、コピー先のファイル名を自動的にセットするための方法として、既存ファイル名の末尾に数値の連番を付与します。

ソースコード

ファイル名:nsn.go

// nsn.go
// New-SEQName - 同名ファイルが有る場合連番を付与するコード
package main

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

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: nsn <filePath>")
		return
	}

	base := os.Args[1]

	// Base が実在しなければそのまま返す
	if _, err := os.Stat(base); os.IsNotExist(err) {
		fmt.Println(base)
		return
	}

	directory := filepath.Dir(base)
	if directory == "." || directory == "" {
		directory = "."
	}

	filename := filepath.Base(base)
	ext := filepath.Ext(filename)
	nameOnly := filename[:len(filename)-len(ext)]

	index := 1
	for {
		newName := filepath.Join(directory, fmt.Sprintf("%s(%d)%s", nameOnly, index, ext))

		if _, err := os.Stat(newName); os.IsNotExist(err) {
			fmt.Println(newName)
			break
		}
		index++
	}
}

ビルド

go build nsn.go

成功すると、”nsn.exe”ファイルが出来上がる。

実行例

ls *.png | % { cp $_.FullName (./nsn.exe $_.Name) }

コメント