go-rename/main.go

81 lines
2.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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])
}
}