某个时间段修改的文件
大约 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("文件扫描完毕!")
}