我有数百个文件名,文件名中带有数字标签,如下所示:
AAAA #12 SSSS.TXT
BBB #231 CDF.TXT
CDFSDAAAA #1 AAAASS.TXT
我想这样重命名:
#012 - AAAA #12 SSSS.TXT
#231 - BBB #231 CDF.TXT
#001 - CDFSDAAAA #1 AAAASS.TXT
我怎样才能做到呢?
谢谢
答案1
在 bash shell 中,
for file in *.TXT
do
[[ $file =~ \#([[:digit:]]+) ]] && mv -- "$file" "#$(printf '%03d' "${BASH_REMATCH[1]}") - ${file}"
done
这会循环当前目录中以 结尾的所有文件,.TXT
并将它们与 bash 的=~
条件表达式运算符进行比较。它将传入的文件名与右侧的正则表达式进行比较。正则表达式查找哈希标记(已转义,因此不是注释),后跟一些(在括号中捕获)数字。是+
贪婪的,因此它将获取尽可能多的数字(1 位数字、4 位数字等),以第一个非数字结尾(在您的情况下为空格)。
Bash 将捕获的数字保存在${BASH_REMATCH[1]}
(因为它是第一组括号);我们将该数字发送到 ,printf
以便将其用零填充为三位数字,然后附加到 上以进行-
其余的重命名。
仅当匹配成功(通过链接&&
)时才会发生重命名。
答案2
如果您有基于 Perl 的rename
命令
$ rename -n 's/.*#(\d+).*/sprintf "#%03d - %s", $1, $&/e' *.TXT
rename(AAAA #12 SSSS.TXT, #012 - AAAA #12 SSSS.TXT)
rename(BBB #231 CDF.TXT, #231 - BBB #231 CDF.TXT)
rename(CDFSDAAAA #1 AAAASS.TXT, #001 - CDFSDAAAA #1 AAAASS.TXT)
(-n
出于测试目的而添加)。