如何按文件名首个大写字符前的部分创建文件夹并迁移对应文件
按文件名前缀批量移动文件到对应目录
需求说明
你有一个包含3万+文件的目录,文件命名示例如下:
apple_CQ2rtQFD15H_1.txt apple_CQVku8Qjdzx_1.txt apple_CQ2rtQFD15H_3.txt bananna___Bo3-mKXnozt___.txt bananna___CPf6gN5L3SP___.txt bananna___CTu8APZMomD___.txt bananna_rotten___Byj7BPXNnpE___.txt
需要实现:根据文件名首个大写字符之前的部分创建新目录,并将对应文件移入该目录。比如所有以apple_开头的文件移入apple_目录,bananna___开头的移入bananna___目录,bananna_rotten___开头的移入bananna_rotten___目录。
修改后的Tcl脚本
cd "C:/Development/test" # 匹配所有包含大写字母的目标文件,-nocomplain避免无匹配时报错 set files [glob -nocomplain *[A-Z]*.txt] foreach f $files { # 用正则提取首个大写字符前的前缀作为目录名 if {[regexp {^(.*?[a-z_])[A-Z]} $f -> dir_name]} { # 目录不存在则创建 if {![file exists $dir_name]} { file mkdir $dir_name } # 移动文件到目标目录,-force可选,用于覆盖同名文件 file rename -force $f [file join $dir_name $f] } }
关键逻辑解释
- 文件匹配:
glob -nocomplain *[A-Z]*.txt精准筛选出符合命名规则(包含大写字符)的txt文件,避免处理无关文件。 - 正则提取前缀:
^(.*?[a-z_])[A-Z]是核心规则:^锚定字符串开头.*?非贪婪匹配任意字符,直到遇到末尾的[a-z_](确保前缀结束于小写字母或下划线,刚好是首个大写字符的前一位)[A-Z]匹配首个大写字符,作为前缀的终止标记- 通过
-> dir_name将提取到的前缀赋值给目录名变量
- 文件操作:
file join自动适配系统路径分隔符,避免路径拼接错误;-force参数可选,用于处理目标目录已有同名文件的场景。
注意事项
- 先在测试目录小范围验证脚本,确认逻辑正确后再处理大量文件
- 无大写字符的文件会被脚本自动跳过
- 处理3万+文件时,Tcl的执行效率足够应对,建议在系统负载较低时运行
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

