github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/apps/cpdir/cpdir.go (about) 1 // Copyright 2013 <chaishushan{AT}gmail.com>. 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 // 6 // 复制目录 7 // 8 // 根据正则表达式匹配递归复制文件. 9 // 10 // 基本用法: 11 // cpdir src dst 12 // cpdir src dst "\.go$" 13 // cpdir src dst "\.tiff?$" 14 // cpdir src dst "\.tiff?|jpg|jpeg$" 15 // cpdir src dst "\.(par|eip)$" 16 // 17 // 帮助信息: 18 // cpdir -h 19 // 20 package main 21 22 import ( 23 "fmt" 24 "io" 25 "io/ioutil" 26 "log" 27 "os" 28 "path/filepath" 29 "regexp" 30 ) 31 32 const usage = ` 33 Usage: cpdir src dst [filter] 34 cpdir -h 35 36 Example: 37 cpdir src dst 38 cpdir src dst "\.go$" 39 cpdir src dst "\.tiff?$" 40 cpdir src dst "\.tiff?|jpg|jpeg$" 41 cpdir src dst "\.par|eip$" 42 43 Report bugs to <chaishushan{AT}gmail.com>. 44 ` 45 46 func main() { 47 if len(os.Args) < 3 { 48 fmt.Fprintln(os.Stderr, usage[1:len(usage)-1]) 49 os.Exit(0) 50 } 51 filter := ".*" 52 if len(os.Args) > 3 { 53 filter = os.Args[3] 54 } 55 total := cpDir(os.Args[2], os.Args[1], filter) 56 fmt.Printf("total %d\n", total) 57 } 58 59 func cpDir(dst, src, filter string) (total int) { 60 entryList, err := ioutil.ReadDir(src) 61 if err != nil && !os.IsExist(err) { 62 log.Fatal("cpDir: ", err) 63 } 64 for _, entry := range entryList { 65 if entry.IsDir() { 66 cpDir(dst+"/"+entry.Name(), src+"/"+entry.Name(), filter) 67 } else { 68 mathed, err := regexp.MatchString(filter, entry.Name()) 69 if err != nil { 70 log.Fatal("regexp.MatchString: ", err) 71 } 72 if mathed { 73 srcFname := filepath.Clean(src + "/" + entry.Name()) 74 dstFname := filepath.Clean(dst + "/" + entry.Name()) 75 fmt.Printf("copy %s\n", srcFname) 76 77 cpFile(dstFname, srcFname) 78 total++ 79 } 80 } 81 } 82 return 83 } 84 85 func cpFile(dst, src string) { 86 err := os.MkdirAll(filepath.Dir(dst), 0666) 87 if err != nil && !os.IsExist(err) { 88 log.Fatal("cpFile: ", err) 89 } 90 fsrc, err := os.Open(src) 91 if err != nil { 92 log.Fatal("cpFile: ", err) 93 } 94 defer fsrc.Close() 95 96 fdst, err := os.Create(dst) 97 if err != nil { 98 log.Fatal("cpFile: ", err) 99 } 100 defer fdst.Close() 101 if _, err = io.Copy(fdst, fsrc); err != nil { 102 log.Fatal("cpFile: ", err) 103 } 104 }