github.com/rck/u-root@v0.0.0-20180106144920-7eb602e381bb/cmds/mv/mv.go (about)

     1  // Copyright 2012-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  // Mv renames files and directories.
     6  //
     7  // Synopsis:
     8  //     mv SOURCE TARGET
     9  //     mv SOURCE... DIRECTORY
    10  //
    11  // Author:
    12  //     Beletti (rhiguita@gmail.com)
    13  package main
    14  
    15  import (
    16  	"flag"
    17  	"fmt"
    18  	"log"
    19  	"os"
    20  	"path/filepath"
    21  )
    22  
    23  func usage() {
    24  	fmt.Fprintf(os.Stderr, "usage: %s source target\n", os.Args[0])
    25  	fmt.Fprintf(os.Stderr, "       %s source ... directory\n", os.Args[0])
    26  	os.Exit(1)
    27  }
    28  
    29  func mv(files []string, todir bool) error {
    30  	if len(files) == 2 && todir == false {
    31  		if err := os.Rename(files[0], files[1]); err != nil {
    32  			return err
    33  		}
    34  	} else {
    35  		lf := files[len(files)-1]
    36  		// "copying" N files to 1 directory
    37  		for _, f := range files[:len(files)-1] {
    38  			ndir := filepath.Join(lf, filepath.Base(f))
    39  			if err := os.Rename(f, ndir); err != nil {
    40  				return err
    41  			}
    42  		}
    43  	}
    44  	return nil
    45  }
    46  
    47  func main() {
    48  	var todir bool
    49  	flag.Parse()
    50  
    51  	if flag.NArg() < 2 {
    52  		usage()
    53  	}
    54  
    55  	files := flag.Args()
    56  	lf := files[len(files)-1]
    57  	if lfdir, err := os.Lstat(lf); err == nil {
    58  		todir = lfdir.IsDir()
    59  	}
    60  	if flag.NArg() > 2 && todir == false {
    61  		fmt.Printf("not a directory: %s\n", lf)
    62  		os.Exit(1)
    63  	}
    64  
    65  	if err := mv(files, todir); err != nil {
    66  		log.Fatalf("%v", err)
    67  	}
    68  }