cp

package
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 25, 2026 License: MIT Imports: 6 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Cmd = &cli.Command{
	Name:  "cp",
	Usage: "Copy files and directories",
	Flags: []cli.Flag{
		&cli.BoolFlag{Name: "recursive", Aliases: []string{"r"}, Usage: "Copy directories recursively"},
		&cli.BoolFlag{Name: "interactive", Aliases: []string{"i"}, Usage: "Prompt before overwrite"},
		&cli.BoolFlag{Name: "verbose", Aliases: []string{"v"}, Usage: "Print source/destination paths"},
	},
	Action: func(ctx context.Context, cmd *cli.Command) error {
		recursive := cmd.Bool("recursive")
		interactive := cmd.Bool("interactive")
		verbose := cmd.Bool("verbose")

		files := cmd.Args().Slice()
		if len(files) < 2 {
			return fmt.Errorf("missing file operand")
		}

		source := files[:len(files)-1]
		dest := files[len(files)-1]

		destInfo, err := os.Stat(dest)
		if err != nil {
			if os.IsNotExist(err) {
				if len(source) != 1 {
					return fmt.Errorf("target '%s' is not a directory", dest)
				}
				dest = filepath.Join(filepath.Dir(dest), filepath.Base(source[0]))
			} else {
				return err
			}
		} else if destInfo.IsDir() {
			for _, s := range source {
				dest = filepath.Join(dest, filepath.Base(s))
			}
		}

		if len(source) == 1 {
			return copyFile(source[0], dest, recursive, interactive, verbose)
		}

		for _, s := range source {
			d := filepath.Join(dest, filepath.Base(s))
			if err := copyFile(s, d, recursive, interactive, verbose); err != nil {
				return err
			}
		}
		return nil
	},
}

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL