跳至主要內容

某个时间段修改的文件

OrangBus大约 2 分钟

package main

import (
	"flag"
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"time"
)

var (
	basePath   string
	dirName    string // 指定额外的目录
	date       string // 时间范围
	ext        string // 指定扩展名
	excludeDir string // 指定排除的目录

	extMap        []string // 扩展名
	excludeDirMap []string // 需要排除的目录
	dateBt        []string // 时间段
)

var number = 0 // 扫描文件的数量

func init() {
	pathStr, err := os.Executable()
	if err != nil {
		panic(err)
	}

	// 获取需要的参数
	flag.StringVar(&dirName, "d", "", "指定额外的目录,默认是当前执行的目录")
	flag.StringVar(&date, "t", "", "时间范围 2023-01-01 / 2023-01-01,2023-01-30")
	flag.StringVar(&ext, "e", "", "指定扩展名 -e php,png")
	flag.StringVar(&excludeDir, "i", "", "需要排除的目录: -i git,dist")
	flag.Parse()

	fmt.Printf("%s 欢迎使用文件扫描工具, author by orangbus.cn  %s\n", strings.Repeat("=", 17), strings.Repeat("=", 17))
	fmt.Println(strings.Repeat(">", 80))

	// 处理的目录
	if dirName != "" {
		basePath = filepath.Join(pathStr, dirName)
		fmt.Printf("扫描目录:%s\n", basePath)
	}
	// 时间解析
	if date != "" {
		if strings.Contains(date, ",") {
			split := strings.Split(date, ",")
			dateBt = split
			fmt.Printf("时间范围:%s - %s\n", dateBt[0], dateBt[1])

		}
	}

	// 扩展名解析
	if ext != "" {
		split := strings.Split(ext, ",")
		extMap = split
		fmt.Printf("包含的扩展名:%s\n", ext)
	}

	// 排除目录解析
	if excludeDir != "" {
		split := strings.Split(excludeDir, ",")
		excludeDirMap = split
		fmt.Printf("排除的目录:%s\n", excludeDir)
	}
	fmt.Println(strings.Repeat("<", 80))
}

// 遍历文件路径
func scannerDir(path string) error {
	files, err := filepath.Glob(filepath.Join(path, "*"))
	if err != nil {
		return err
	}
	for _, file := range files {
		// 读取文件信息
		fileInfo, err := os.Stat(file)
		if err != nil {
			fmt.Println(err)
			return err
		}
		number += 1

		// 扩展名解析
		if fileInfo.IsDir() {
			// 排除目录解析
			if len(excludeDirMap) > 0 && DirIsInclude(fileInfo.Name(), excludeDirMap) {
				continue
			}
		} else {
			if len(extMap) > 0 && ExtIsInclude(fileInfo.Name(), extMap) {
				continue
			}
		}

		// 时间解析
		if len(dateBt) == 2 && !CheckFileDate(fileInfo.ModTime()) {
			continue
		}

		fmt.Printf("在%d-%d-%d修改的文件 => %s\n", fileInfo.ModTime().Year(), int(fileInfo.ModTime().Month()), fileInfo.ModTime().Day(), file)

		if fileInfo.IsDir() {
			err := scannerDir(file)
			if err != nil {
				return err
			}
		}
	}
	return nil
}

// 判断某个时间是否在某个时间段内
func CheckFileDate(date time.Time) bool {
	startDate, _ := time.Parse("2006-01-02", dateBt[0])
	endDate, _ := time.Parse("2006-01-02", dateBt[1])
	if date.After(startDate) && date.Before(endDate) {
		return true
	}
	return false
}

// 包含目录
func DirIsInclude(name string, list []string) bool {
	result := false
	if len(list) == 0 {
		return result
	}
	for _, v := range list {
		if v == name {
			result = true
			break
		}
	}
	return result
}

// 扩展名是否包含
func ExtIsInclude(name string, list []string) bool {
	if len(list) == 0 {
		return false
	}
	if !strings.Contains(name, ".") {
		return false
	}
	split := strings.Split(name, ".")
	ext := split[len(split)-1]
	result := false
	for _, v := range list {
		if ext == v {
			result = true
			break
		}
	}
	return result
}

// goFile -d public -t 2024-01-01,2024-01-30 -e html,js,css -i git
// go run main.go -d public -t 2024-01-01,2024-01-30 -e html,js,css -i git
func main() {
	// 遍历文件目录
	err := scannerDir(basePath)
	if err != nil {
		fmt.Println("文件扫描失败:", err)
		return
	}
	if number > 0 {
		fmt.Println("文件扫描完毕,累计文件数:", number)
		return
	}
	fmt.Println("文件扫描完毕!")
}