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  }