You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按文件名首个大写字符前的部分创建文件夹并迁移对应文件

按文件名前缀批量移动文件到对应目录

需求说明

你有一个包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:54:51