go-rename/main.go

81 lines
2.0 KiB
Go
Raw Normal View History

2024-02-25 17:10:08 +00:00
package main
import (
"fmt"
"os"
"strings"
"gitea.zaclys.com/bvaudour/gob/format"
"gitea.zaclys.com/bvaudour/gob/shell/console/read"
"github.com/rwtodd/Go.Sed/sed"
)
// Vérifie si un fichier/dossier existe.
func exists(path string) bool {
_, err := os.Stat(path)
return err == nil
}
// Imprime laide.
func help() {
fmt.Println(format.Apply("Usage :", "l_yellow"), os.Args[0], "<regexp> <file> [<other_files>...]")
}
func main() {
// On vérifie dabord que la commande contient bien une regexp et au moins un fichier.
if len(os.Args) <= 2 {
fmt.Fprintln(os.Stderr, format.Apply("Veuillez saisir au moins 2 arguments", "l_red"))
help()
os.Exit(1)
}
// Le premier argument spécifie la regexp. Celle-ci doit être valide (ie. sous la même forme que celle utilisée pour sed).
engine, err := sed.New(strings.NewReader(os.Args[1]))
if err != nil {
fmt.Fprintln(os.Stderr, format.Apply(err.Error(), "l_red"))
os.Exit(1)
}
// On regarde les fichiers à renommer, on vérifie quils existent et quon peut les renommer selon la regexp.
var replaces [][]string
n := 0
for _, e1 := range os.Args[2:] {
e1 = strings.TrimSpace(e1)
if !exists(e1) {
continue
}
if e2, err := engine.RunString(e1); err == nil {
e2 = strings.TrimSpace(e2)
if e1 == e2 || len(e2) == 0 {
continue
}
replaces = append(replaces, []string{e1, e2})
if l := len(e1); l > n {
n = l
}
}
}
// Si aucun fichier à remplacer, on affiche un message et on sort.
if len(replaces) == 0 {
fmt.Fprintln(os.Stderr, format.Apply("Aucun fichier à remplacer", "yellow"))
return
}
// Sinon, on affiche les renommages qui seront effectués.
for _, r := range replaces {
fmt.Printf("%s → %s\n", format.Left(r[0], n), r[1])
}
// On demande une confirmation explicite avant renommage effectif.
if !read.QuestionBool("Remplacer ?", true) {
fmt.Fprintln(os.Stderr, format.Apply("Opération annulée", "yellow"))
}
// Renommage.
for _, r := range replaces {
os.Rename(r[0], r[1])
}
}