在Golang中实现目录下所有文件的批量重命名,核心依赖标准库的os包和filepath包,通过遍历目录获取所有文件信息,再按照自定义规则生成新文件名,最后调用重命名方法完成操作。整个过程不需要引入第三方依赖,实现起来简单高效。

核心依赖包说明
实现文件批量重命名主要用到两个标准包:
- os包:提供文件操作相关的方法,比如
os.Rename用于重命名文件,os.Stat用于获取文件信息,os.ReadDir用于读取目录下的文件列表。 - filepath包:提供文件路径处理的方法,比如
filepath.WalkDir用于递归遍历目录下的所有文件,filepath.Join用于拼接文件路径,避免不同系统路径分隔符的问题。
实现步骤拆解
1. 遍历目标目录获取所有文件
如果只需要处理目标目录下的直接文件,不需要递归子目录,可以使用os.ReadDir方法;如果需要处理所有子目录下的文件,推荐使用filepath.WalkDir方法,它会自动递归遍历所有层级的文件。
2. 筛选需要重命名的文件
遍历到文件后,可以根据需求筛选文件,比如过滤掉目录、只处理特定后缀的文件、排除隐藏文件等。可以通过os.DirEntry的IsDir方法判断是否为目录,通过filepath.Ext获取文件后缀进行筛选。
3. 生成新文件名并执行重命名
根据自定义规则生成新文件名,比如添加前缀、修改后缀、替换文件名中的特定字符等,然后调用os.Rename方法完成重命名。需要注意新文件名的路径要和原文件路径在同一目录下,否则会变成移动文件操作。
完整示例代码
以下示例实现了递归遍历指定目录下的所有txt文件,给每个文件名添加new_前缀的功能:
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
)
// 批量重命名目录下所有txt文件,添加new_前缀
func batchRenameTxtFiles(rootDir string) error {
// 使用WalkDir递归遍历目录
err := filepath.WalkDir(rootDir, func(path string, d os.DirEntry, err error) error {
// 如果遍历过程出错,直接返回错误
if err != nil {
return err
}
// 跳过目录,只处理文件
if d.IsDir() {
return nil
}
// 获取文件后缀,只处理txt文件
ext := strings.ToLower(filepath.Ext(path))
if ext != ".txt" {
return nil
}
// 获取文件所在目录和原文件名
dir := filepath.Dir(path)
oldName := d.Name()
// 生成新文件名,添加new_前缀
newName := "new_" + oldName
// 拼接新的完整路径
newPath := filepath.Join(dir, newName)
// 执行重命名操作
err = os.Rename(path, newPath)
if err != nil {
// 打印重命名失败的文件信息,不中断整个流程
fmt.Printf("重命名文件%s失败,错误:%vn", path, err)
return nil
}
fmt.Printf("成功重命名:%s -> %sn", path, newPath)
return nil
})
return err
}
func main() {
// 目标目录,可替换为实际目录路径
targetDir := "./test_files"
err := batchRenameTxtFiles(targetDir)
if err != nil {
fmt.Printf("批量重命名过程出错:%vn", err)
return
}
fmt.Println("批量重命名完成")
}
注意事项
- 重命名前建议先备份原文件,避免重命名规则错误导致文件丢失。
- 如果新文件名已经存在,
os.Rename会直接覆盖原有文件,需要根据需求添加重名判断逻辑。 - 处理跨磁盘的文件重命名时,
os.Rename可能会失败,这种场景下需要先复制文件再删除原文件。 - 遍历目录时注意权限问题,如果目录没有读取权限,会导致遍历失败,需要提前处理权限错误。
自定义规则扩展
如果需要修改重命名规则,只需要调整生成新文件名的逻辑即可,比如以下常见场景:
- 修改文件后缀:将
newName := "new_" + oldName改为newName := strings.TrimSuffix(oldName, ".txt") + ".md",即可将txt后缀改为md后缀。 - 按序号重命名:定义全局计数器,每处理一个文件计数器加1,新文件名使用序号拼接,比如
newName := fmt.Sprintf("file_%d.txt", counter)。 - 替换文件名中的特定字符:使用
strings.ReplaceAll方法替换文件名中的指定字符,比如newName := strings.ReplaceAll(oldName, "old", "new")。