Skip to content

Commit 1a3d3ae

Browse files
committed
✨ Feat: dir_auto 模式下支持按照正则表达式解析时间
1 parent 4ea5a29 commit 1a3d3ae

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

.DS_Store

0 Bytes
Binary file not shown.

README.md

+23-1
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,13 @@ Usage of quexif:
5050
操作模式: qumagie (QuMagie 备份照片处理), dir (指定文件夹批量修改 EXIF时间), dir_auto (按照路径推导时间), read (读取目录或文件的 EXIF 时间信息) (default "read")
5151
-p string
5252
文件夹路径 (default "./")
53+
-r string
54+
仅 dir_auto 模式适用, 在解析时间之前, 从文件名中提取时间的正则表达式
5355
-skip
5456
跳过安全询问, 直接执行
5557
-t string
5658
日期时间模板, 默认为 '2006-01-02 15.04.05' 请参照 Golang 时间 layout 设置, 不适用于 QuMagie 模式 (default "2006-01-02 15.04.05")
59+
5760
```
5861

5962
- 批量修改某个目录及其子目录下的所有图片为指定时间
@@ -86,7 +89,26 @@ $ ./quexif -m dir -d '2024-11-23' -t '2006-01-02' -p ./pics
8689

8790
$ ./quexif -m dir_auto -t '2006-01-02' -p ./pics
8891

89-
# -m dir_date 表示修改目录下的所有图片, 并按照文件名推导时间
92+
# -m dir_auto 表示修改目录下的所有图片, 并按照文件名推导时间
93+
# -t '2006-01-02' 表示时间格式为 2006-01-02
94+
# -p ./pics 表示目录为 ./pics
95+
```
96+
97+
- 使用正则, 批量推导文件名中的时间
98+
99+
```shell
100+
# 例如您的目录结构为
101+
.
102+
├── wechat_2022-11-23.jpg
103+
├── wechat_2023-11-23.jpg
104+
│── wechat_2024-11-23.jpg
105+
106+
此时您可以执行如下脚本, 脚本将自动根据正则表达式提取时间字符串, 按照 dateTpl 进行时间解析后写入 Exif
107+
108+
$ ./quexif -m dir_auto -r "wechat_(.*).jpg" -t "2006-01-02" -p ./pics
109+
110+
# -m dir_auto 表示修改目录下的所有图片, 并按照文件名推导时间
111+
# -r 为正则表达式, 例如 "wechat_(.*).jpg" 表示提取 wechat_2022-11-23 10.22.23.jpg 中的 2022-11-23 10.22.23
90112
# -t '2006-01-02' 表示时间格式为 2006-01-02
91113
# -p ./pics 表示目录为 ./pics
92114
```

dir_auto/dir_auto.go

+21
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"path/filepath"
88
"photo_exif_do/fg"
99
"photo_exif_do/x_exif"
10+
"regexp"
1011
"strings"
1112
"time"
1213
)
@@ -71,6 +72,26 @@ func tryGetDate(path string) (time.Time, error) {
7172
sp := strings.Split(path, "/")
7273

7374
for i := len(sp) - 1; i >= 0; i-- {
75+
if fg.Regex != "" {
76+
// 尝试进行正则匹配
77+
re := regexp.MustCompile(fg.Regex)
78+
79+
if re.MatchString(sp[i]) {
80+
timeStr := re.FindStringSubmatch(sp[i])
81+
82+
for _, v := range timeStr {
83+
parsedTime, err := time.Parse(fg.DateTpl, v)
84+
if err == nil {
85+
return parsedTime, nil
86+
}
87+
}
88+
89+
continue
90+
}
91+
92+
continue
93+
}
94+
7495
// 对于后缀
7596
if i == len(sp)-1 && strings.Contains(sp[i], ".") {
7697
sp := strings.Split(sp[i], ".")

fg/fg.go

+2
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ var DateTime string
1010
var DateTpl = "2006-01-02 15.04.05"
1111
var Force bool
1212
var SkipSafeQA bool
13+
var Regex string
1314

1415
// Parse 解析命令行参数
1516
func Parse() {
1617
flag.StringVar(&Mode, "m", "read", "操作模式: qumagie (QuMagie 备份照片处理), dir (指定文件夹批量修改 EXIF时间), dir_auto (按照路径推导时间), read (读取目录或文件的 EXIF 时间信息)")
1718
flag.StringVar(&Path, "p", "./", "文件夹路径")
1819
flag.StringVar(&DateTime, "d", "", "日期时间")
1920
flag.StringVar(&DateTpl, "t", "2006-01-02 15.04.05", "日期时间模板, 默认为 '2006-01-02 15.04.05' 请参照 Golang 时间 layout 设置, 不适用于 QuMagie 模式")
21+
flag.StringVar(&Regex, "r", "", "仅 dir_auto 模式适用, 在解析时间之前, 从文件名中提取时间的正则表达式")
2022
flag.BoolVar(&Force, "f", false, "强制执行, 不会检查是否已经有日期")
2123
flag.BoolVar(&SkipSafeQA, "skip", false, "跳过安全询问, 直接执行")
2224

0 commit comments

Comments
 (0)