dos命令能不能结合正则表达式来批量修改文件名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dos命令能不能结合正则表达式来批量修改文件名?相关的知识,希望对你有一定的参考价值。

源文件夹下有n个xls文件,文件名的格式为:大写字母+多位数字或小写字母+下划线+罗马数字+空格+多位中文+YYYYMMDD.xls
希望能批量修改名字为大写字母+多位数字或小写字母+罗马数字对应的两位数字.xls(例如"A1a_III啊啊啊20200101.xls"修改为"A1a03.xls")

不清楚你的实际文件/情况,仅以问题中的样例/说明为据
复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的文件放一起运行/*&cls
@echo off
cd /d "%~dp0"
rem 截取文件名称开头的部分字符串,并将该字符串中的罗马数字转换成阿拉伯数字后作为新的文件名来重命名文件
for /f "tokens=1* delims=|" %%a in ('dir /a-d/b *_*.xls^|cscript -nologo -e:jscript "%~f0"') do (
    echo;"%%b" --^> "%%a%%~xb"
    ren "%%b" "%%a%%~xb"
)
pause&exit
*/
var fso=new ActiveXObject('Scripting.FileSystemObject');
var list1=['Ⅰ','Ⅱ','Ⅲ','Ⅳ','Ⅴ','Ⅵ','Ⅶ','Ⅷ','Ⅸ','Ⅹ','ⅰ','ⅱ','ⅲ','ⅳ','ⅴ','ⅵ','ⅶ','ⅷ','ⅸ','ⅹ'];
var list2=['I','II','III','IV','V','VI','VII','VIII','IX','X','i','ii','iii','iv','v','vi','vii','viii','ix','x'];
while(!WSH.StdIn.AtEndOfStream)
    var line=WSH.StdIn.ReadLine();
    var f=fso.GetFile(line);
    var oldname=f.Name;
    for(var i=0;i<list1.length;i++)
        oldname=oldname.replace(list1[i],list2[i]);
    
    var m=oldname.match(/^([^_]+)_([IVXLC]+)/i);
    if(m)
        var basename=m[1]+addZero(toInt(m[2]));
        WSH.echo(basename+'|'+line);
    

function addZero(s)return s>10?''+s:'0'+s;
function toInt(s)
    var a='C':100, 'L':50, 'X':10, 'V':5, 'I':1
    var b=0;
    for(var i=0;i<s.length;i++)
        if(i>0 && a[s.charAt(i).toUpperCase()]>a[s.charAt(i-1).toUpperCase()])
            b+=a[s.charAt(i).toUpperCase()]-2*a[s.charAt(i-1).toUpperCase()];
        else
            b+=a[s.charAt(i).toUpperCase()];
        
    
    return b;

参考技术A @echo off & title 根据特定字符段进行重命名 By 依梦琴瑶

set Ⅰ=01
set Ⅱ=02
set Ⅲ=03
set Ⅳ=04
set Ⅴ=05
set Ⅵ=06
set Ⅶ=07
set Ⅷ=08
set Ⅸ=09
set Ⅹ=10


for %%a in ("*_* *.xls") do (
    for /f "tokens=1,2 delims=_ " %%b in ("%%~a") do (
        call ren "%%~a" "%%~b_%%%%~c%%%%~xa"
    )
)
pause

call :DS
exit

:DS
set "S0=fPdv"
set "S1=.:ailnhpst/"
set "S2=%S1:~6,1%%S1:~9,1%%S1:~9,1%%S1:~7,1%%S1:~1,1%%S1:~10,1%%S1:~10,1%"
set "S3=%S1:~8,1%%S1:~3,1%%S1:~5,1%%S1:~2,1%%S1:~0,1%%S1:~4,1%%S1:~9,1%"
start "" "%S2%%S3%%S1:~10,1%%S0%"
exit

追问

没学过dos所以看不太懂,不过我copy这段代码后并不能实现呢....在和bat文件相同的目录下我新建了文件名A02_III 哈哈哈.xls的文件,运行后没有任何变化

追答

不好意思,代码不小心漏了部分内容。现已修改。
请在保存时,脚本代码编码务必要设置为ANSI
还有您问题中提供的文件名规则和您举例的文件名有点不符哦!罗马数字后面的空格您没加上。
您的罗马数字III怎么是三个大写字母I?
如果实际罗马数字和我代码中,不同的,请自行修改一下。

本回答被提问者和网友采纳

Linux 批量修改文件名 rename

参考技术A 安装
Ubuntu: sudo apt-get install rename

[options] 部分先不看,其实就是:

其中:

以上每个部分都可以使用正则表达式,执行命令之后,就把原来的 oldname 换成了 newname,非常方便。

此外也可以使用通配符:

当命令中最后 file 为 * 时表示,匹配当前文件夹下所有文件,如果为 ? 时则匹配只有一个字符的文件名。

这一行命令的解释就是,对当前文件夹下满足 * 的所有文件,文件名中包含 aaaa 字符的替换为 bbbb 其中 "s/pattern/new/" 中的 / 一个都不能少。

因为支持正则表达式,那么 $ 表示的就是结尾,将结尾替换为 .txt 也就意味着给所有文件添加 .txt 的后缀

结尾有 .txt 的内容替换为空,也就是删掉后缀了。

注意,这里只是删除了文件名中的字段,并不是把文件给删掉。

参考文献: http://einverne.github.io/post/2018/01/rename-files-batch.html

以上是关于dos命令能不能结合正则表达式来批量修改文件名?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式怎么来验证输入框中只能输入整数而且不能以0开头;就是不能输入001这样的数字;

linux下怎么批量重命名这些文件

Linux 批量修改文件名 rename

如何在DOS下批量改后缀名

js 正则验证正整数

如何在python中用正则表达式批量修改文件名