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  }