github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/core/rm/rm.go (about) 1 // Copyright 2013-2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Delete files. 6 // 7 // Synopsis: 8 // 9 // rm [-Rrvif] FILE... 10 // 11 // Options: 12 // 13 // -i: interactive mode 14 // -v: verbose mode 15 // -R: remove file hierarchies 16 // -r: equivalent to -R 17 // -f: ignore nonexistent files and never prompt 18 package main 19 20 import ( 21 "bufio" 22 "flag" 23 "fmt" 24 "io" 25 "log" 26 "os" 27 "path" 28 "path/filepath" 29 "strings" 30 31 "github.com/mvdan/u-root-coreutils/pkg/uroot/util" 32 ) 33 34 var ( 35 interactive = flag.Bool("i", false, "Interactive mode.") 36 verbose = flag.Bool("v", false, "Verbose mode.") 37 recursive = flag.Bool("r", false, "equivalent to -R") 38 r = flag.Bool("R", false, "Recursive, remove hierarchies") 39 force = flag.Bool("f", false, "Force, ignore nonexistent files and never prompt") 40 ) 41 42 const usage = "rm [-Rrvif] file..." 43 44 func rm(stdin io.Reader, files []string) error { 45 if len(files) < 1 { 46 return fmt.Errorf("%v", usage) 47 } 48 f := os.Remove 49 if *recursive || *r { 50 f = os.RemoveAll 51 } 52 53 if *force { 54 *interactive = false 55 } 56 57 workingPath, err := os.Getwd() 58 if err != nil { 59 return err 60 } 61 62 input := bufio.NewReader(stdin) 63 for _, file := range files { 64 if *interactive { 65 fmt.Printf("rm: remove '%v'? ", file) 66 answer, err := input.ReadString('\n') 67 if err != nil || strings.ToLower(answer)[0] != 'y' { 68 continue 69 } 70 } 71 72 if err := f(file); err != nil { 73 if *force && os.IsNotExist(err) { 74 continue 75 } 76 return err 77 } 78 79 if *verbose { 80 toRemove := file 81 if !path.IsAbs(file) { 82 toRemove = filepath.Join(workingPath, file) 83 } 84 fmt.Printf("removed '%v'\n", toRemove) 85 } 86 } 87 return nil 88 } 89 90 func main() { 91 flag.Usage = util.Usage(flag.Usage, usage) 92 flag.Parse() 93 if err := rm(os.Stdin, flag.Args()); err != nil { 94 log.Fatal(err) 95 } 96 }