Skip to content

Commit 6679167

Browse files
author
asus
committed
feat(cli): 添加批量重命名功能
- 新增 rename 子命令用于批量替换文件名中的特定字符串 - 实现了递归遍历目录中所有文件的重命名功能 - 添加了文件名匹配检查避免不必要的重命名操作 - 集成到主命令行界面中作为新的功能选项 - 提供详细的重命名过程日志输出
1 parent 19d0225 commit 6679167

3 files changed

Lines changed: 65 additions & 0 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ vendor
1515
history.txt
1616
avmerge.exe
1717
main.exe
18+
AVmerger.exe

main.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"AVmerger/core"
77
"AVmerger/cover"
8+
"AVmerger/rename"
89
"AVmerger/util"
910

1011
"github.com/spf13/cobra"
@@ -14,6 +15,7 @@ var (
1415
src string
1516
dst string
1617
archive string
18+
dir string
1719
)
1820

1921
var rootCmd = &cobra.Command{
@@ -89,6 +91,15 @@ var archiveCmd = &cobra.Command{
8991
},
9092
}
9193

94+
var renameCmd = &cobra.Command{
95+
Use: "rename",
96+
Short: "批量重命名文件",
97+
Long: `批量替换指定目录下所有文件名中的特定字符串`,
98+
Run: func(cmd *cobra.Command, args []string) {
99+
rename.RenameAll(dir, src, dst)
100+
},
101+
}
102+
92103
func init() {
93104
util.SetLog("avmerge.log")
94105
// 为 client 命令添加标志
@@ -116,11 +127,20 @@ func init() {
116127
archiveCmd.MarkFlagRequired("src")
117128
archiveCmd.MarkFlagRequired("dst")
118129

130+
// 为 rename 命令添加标志
131+
renameCmd.Flags().StringVarP(&dir, "dir", "d", "", "要处理的根目录路径 (必填)")
132+
renameCmd.Flags().StringVarP(&src, "src", "i", "", "需要被替换的字符串 (必填)")
133+
renameCmd.Flags().StringVarP(&dst, "dst", "o", "", "替换后的字符串 (必填)")
134+
renameCmd.MarkFlagRequired("dir")
135+
renameCmd.MarkFlagRequired("src")
136+
renameCmd.MarkFlagRequired("dst")
137+
119138
// 将子命令添加到根命令
120139
rootCmd.AddCommand(clientCmd)
121140
rootCmd.AddCommand(android2pcCmd)
122141
rootCmd.AddCommand(coverCmd)
123142
rootCmd.AddCommand(archiveCmd)
143+
rootCmd.AddCommand(renameCmd)
124144
}
125145

126146
func main() {

rename/batchRename.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package rename
2+
3+
import (
4+
"log"
5+
"os"
6+
"path/filepath"
7+
"strings"
8+
9+
"github.com/zhangyiming748/finder"
10+
)
11+
12+
// fp 文件路径
13+
// src 需要被替换的文件名中的子字符串
14+
// dst 需要替换成的文件名中的子字符串
15+
func renameOne(fp, src, dst string) error {
16+
// 获取文件所在目录和文件名
17+
dir := filepath.Dir(fp)
18+
baseName := filepath.Base(fp)
19+
20+
// 检查文件名中是否包含要替换的字符串
21+
if !strings.Contains(baseName, src) {
22+
return nil // 如果不包含,直接返回,不进行重命名
23+
}
24+
25+
// 替换文件名中的字符串
26+
newBaseName := strings.ReplaceAll(baseName, src, dst)
27+
28+
// 构建新的完整文件路径
29+
newPath := filepath.Join(dir, newBaseName)
30+
log.Printf("原文件绝对路径:%v\t重命名后文件绝对路径:%v\n", fp, newPath)
31+
// 执行重命名操作
32+
return os.Rename(fp, newPath)
33+
}
34+
35+
func RenameAll(root, src, dst string) {
36+
files := finder.FindAllFiles(root)
37+
l := len(files)
38+
for i, file := range files {
39+
log.Printf("开始重命名第 %d/%d 个文件: %s", i+1, l, file)
40+
if err := renameOne(file, src, dst); err != nil {
41+
log.Printf("重命名文件 %s 失败: %v", file, err)
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)