regex - 如何在第一个大写字符之前创建一个以文件名的一部分命名的文件夹,并将相应的文件移动到新目录中

标签 regex bash tcl

我有一个包含 30,000 多个文件的目录,其命名约定如下:

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_ 的目录中。

有人解决这个问题吗?我正在考虑修改这个 Tcl 脚本:

cd "C:/Development/test"
# glob is a tcl command to list all functions that match the requirements
set files [glob TTT*_*]
foreach f $files {
  # use the underscore as a separator to split f and store the parts in dir and fnew
  lassign [split $f "_"] dir fnew
  if {![file exist $dir]} {
    file mkdir $dir
  }
  file rename $f [file join $dir $fnew]
}

并使用正则表达式 [A-Z]\S+ 代替 [split $f "_"] 但我真的不知道如何实现它.

最佳答案

之前:

$ tree .
.
├── apple_CQ2rtQFD15H_1.txt
├── apple_CQ2rtQFD15H_3.txt
├── apple_CQVku8Qjdzx_1.txt
├── bananna___Bo3-mKXnozt___.txt
├── bananna___CPf6gN5L3SP___.txt
├── bananna___CTu8APZMomD___.txt
└── bananna_rotten___Byj7BPXNnpE___.txt

使用 Tcl:

foreach file [glob -- *] {
    if {[regexp {^([^_]+)} $file -> prefix]} {
        file mkdir $prefix
        file rename $file $prefix
    }
}

之后:

$ tree .
.
├── apple
│   ├── apple_CQ2rtQFD15H_1.txt
│   ├── apple_CQ2rtQFD15H_3.txt
│   └── apple_CQVku8Qjdzx_1.txt
└── bananna
    ├── bananna___Bo3-mKXnozt___.txt
    ├── bananna___CPf6gN5L3SP___.txt
    ├── bananna___CTu8APZMomD___.txt
    └── bananna_rotten___Byj7BPXNnpE___.txt

关于regex - 如何在第一个大写字符之前创建一个以文件名的一部分命名的文件夹,并将相应的文件移动到新目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73603059/

相关文章:

javascript eval 无法理解字符串中的某些 RegEx?

regex - 如何使用 regex crate 来匹配整个 INI 部分?

Javascript正则表达式出现意想不到的结果

c# - C 中的正则表达式

linux - 来自 tcl 脚本的 cp 命令

tcl - Tcl 8.4 和 8.5 中的 keylset 错误?

linux - 使用 sudo 运行时出现意外标记 `do' 附近的语法错误

linux - "bash: sysctl: command not found"在 debian :stretch-slim

带有图形菜单的 Bash 脚本

user-interface - 检测 TCL 脚本中 TCL 后台进程的结束