From 132017b63dd1ae702632218af0eecf4bcc558d8a Mon Sep 17 00:00:00 2001 From: Benjamin VAUDOUR Date: Sun, 25 Feb 2024 18:10:08 +0100 Subject: [PATCH] Commit initial --- .gitignore | 1 + LICENSE | 11 ++++++++ README.md | 3 ++ go.mod | 8 ++++++ go.sum | 4 +++ main.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 107 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c44e72 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +go-rename diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7a3094a --- /dev/null +++ b/LICENSE @@ -0,0 +1,11 @@ +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. + +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1001d54 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# go-rename + +go-rename est un utilitaire permettant de renommer des fichiers en masse en utilisant une expression régulière. diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..45b5740 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module gitea.zaclys.com/bvaudour/go-rename + +go 1.22.0 + +require ( + gitea.zaclys.com/bvaudour/gob v0.0.0-20240225133050-ec6a3ba492cc // indirect + github.com/rwtodd/Go.Sed v0.0.0-20230610052213-ba3e9c186f0a // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..d6ffe91 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +gitea.zaclys.com/bvaudour/gob v0.0.0-20240225133050-ec6a3ba492cc h1:taHLOnrgyIlGYSs9cu+FXChAYtIeHoJg2D8to+UDgoA= +gitea.zaclys.com/bvaudour/gob v0.0.0-20240225133050-ec6a3ba492cc/go.mod h1:Gw6x0KNKoXv6AMtRkaI+iWM2enVzwHikUSskuEzWQz4= +github.com/rwtodd/Go.Sed v0.0.0-20230610052213-ba3e9c186f0a h1:URwYffGNuBQkfwkcn+1CZhb8IE/mKSXxPXp/zzQsn80= +github.com/rwtodd/Go.Sed v0.0.0-20230610052213-ba3e9c186f0a/go.mod h1:c6qgHcSUeSISur4+Kcf3WYTvpL07S8eAsoP40hDiQ1I= diff --git a/main.go b/main.go new file mode 100644 index 0000000..67777e8 --- /dev/null +++ b/main.go @@ -0,0 +1,80 @@ +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 l’aide. +func help() { + fmt.Println(format.Apply("Usage :", "l_yellow"), os.Args[0], " [...]") +} + +func main() { + // On vérifie d’abord 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 qu’ils existent et qu’on 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]) + } +}