76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/jasonross/text-shark/internal/runner"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
findDeleteYes bool
|
|
findDeleteType string
|
|
)
|
|
|
|
var findDeleteFilesCmd = &cobra.Command{
|
|
Use: "find-delete-files <pattern> [path]",
|
|
Short: "Find files matching <pattern> (by name) and delete them after confirmation",
|
|
Args: cobra.RangeArgs(1, 2),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
pattern := args[0]
|
|
path := "."
|
|
if len(args) == 2 {
|
|
path = args[1]
|
|
}
|
|
|
|
var fdExtra []string
|
|
if findDeleteType != "" {
|
|
fdExtra = append(fdExtra, "--type", findDeleteType)
|
|
}
|
|
|
|
files, err := runner.FdListFiles(pattern, path, fdExtra...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(files) == 0 {
|
|
fmt.Println("No files found.")
|
|
return nil
|
|
}
|
|
|
|
fmt.Printf("Found %d file(s):\n", len(files))
|
|
for _, f := range files {
|
|
fmt.Printf(" %s\n", f)
|
|
}
|
|
|
|
if !findDeleteYes {
|
|
fmt.Printf("\nDelete these %d file(s)? [y/N] ", len(files))
|
|
reader := bufio.NewReader(os.Stdin)
|
|
answer, _ := reader.ReadString('\n')
|
|
answer = strings.TrimSpace(strings.ToLower(answer))
|
|
if answer != "y" && answer != "yes" {
|
|
fmt.Println("Aborted. No files deleted.")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
deleted := 0
|
|
for _, f := range files {
|
|
if err := os.Remove(f); err != nil {
|
|
fmt.Fprintf(os.Stderr, "error deleting %s: %v\n", f, err)
|
|
} else {
|
|
deleted++
|
|
}
|
|
}
|
|
fmt.Printf("%d file(s) deleted.\n", deleted)
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
findDeleteFilesCmd.Flags().BoolVarP(&findDeleteYes, "yes", "y", false, "Skip confirmation prompt and delete all matches")
|
|
findDeleteFilesCmd.Flags().StringVarP(&findDeleteType, "type", "t", "f", "fd type filter: f (file), d (dir), l (symlink)")
|
|
}
|