Files
text_shark/cmd/find_delete_files.go
2026-06-03 15:49:54 -05:00

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