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 }