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