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  }