github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/apps/lsdir/lsdir.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 // 目录列表(list dir) 7 // 8 // 根据正则表达式匹配递归遍历文件. 9 // 10 // 基本用法: 11 // lsdir dir 12 // lsdir dir "\.go$" 13 // lsdir dir "\.go$" "chaishushan" 14 // lsdir dir "\.tiff?|jpg|jpeg$" 15 // lsdir dir "\.(par|eip)$" 16 // 17 // 帮助信息: 18 // lsdir -h 19 // 20 package main 21 22 import ( 23 "fmt" 24 "io/ioutil" 25 "log" 26 "os" 27 "path/filepath" 28 "regexp" 29 ) 30 31 const usage = ` 32 Usage: lsdir dir [nameFilter [dataFilter]] 33 lsdir -h 34 35 Example: 36 lsdir dir 37 lsdir dir "\.go$" 38 lsdir dir "\.tiff?$" 39 lsdir dir "\.tiff?|jpg|jpeg$" 40 lsdir dir "\.par|eip$" 41 42 Report bugs to <chaishushan{AT}gmail.com>. 43 ` 44 45 func main() { 46 if len(os.Args) < 2 || os.Args[1] == "-h" { 47 fmt.Fprintln(os.Stderr, usage[1:len(usage)-1]) 48 os.Exit(0) 49 } 50 dir, nameFilter, dataFilter := os.Args[1], ".*", "" 51 if len(os.Args) > 2 { 52 nameFilter = os.Args[2] 53 } 54 if len(os.Args) > 3 { 55 dataFilter = os.Args[3] 56 } 57 58 total := 0 59 filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 60 if err != nil { 61 log.Fatal("filepath.Walk: ", err) 62 return err 63 } 64 if info.IsDir() { 65 return nil 66 } 67 relpath, err := filepath.Rel(dir, path) 68 if err != nil { 69 log.Fatal("filepath.Rel: ", err) 70 return err 71 } 72 mathed, err := regexp.MatchString(nameFilter, relpath) 73 if err != nil { 74 log.Fatal("regexp.MatchString: ", err) 75 } 76 if mathed { 77 if dataFilter != "" { 78 data, err := ioutil.ReadFile(path) 79 if err != nil { 80 fmt.Printf("ioutil.ReadFile: %s\n", path) 81 log.Fatal("ioutil.ReadFile: ", err) 82 } 83 mathed, err := regexp.MatchString(dataFilter, string(data)) 84 if err != nil { 85 log.Fatal("regexp.MatchString: ", err) 86 } 87 if mathed { 88 fmt.Printf("%s\n", relpath) 89 total++ 90 } 91 } else { 92 fmt.Printf("%s\n", relpath) 93 total++ 94 } 95 } 96 return nil 97 }) 98 fmt.Printf("total %d\n", total) 99 }