[英]Batch .BAT script to rename files
我正在寻找一个批处理脚本来(递归)重命名文件文件夹。重命名示例:34354563.randomname_newname.png到newname.png
我已经从字符串的开头到第一个下划线(它的^(.*?)_
)匹配了RegEx,但是无法说服Windows Batch让我使用RegEx复制或重命名。
从命令行提示符-不带正则表达式 :
FOR /R %f IN (*.*) DO FOR /F "DELIMS=_ TOKENS=1,*" %m IN ("%~nxf") DO @IF NOT "%n" == "" REN "%f" "%n"
在批处理文件中,将%加倍:
FOR /R %%f IN (*.*) DO FOR /F "DELIMS=_ TOKENS=1,*" %%m IN ("%%~nxf") DO @IF NOT "%%n" == "" REN "%%f" "%%n"
编辑:发出以下情况的新的纯批处理解决方案:
批处理(删除ECHO以使其起作用):
FOR /R %%f IN (*.*) DO CALL :UseLast "%%~f" "%%~nf"
GOTO :EOF
:UseLast
FOR /F "DELIMS=_ TOKENS=1,*" %%m IN (%2) DO IF "%%n"=="" (
IF NOT "%~2"=="%~n1" ECHO REN %1 "%~2%~x1"
) ELSE CALL :UseLast %1 "%%n"
GOTO :EOF
在扩展名中避免_
:
@ECHO OFF
FOR /F "DELIMS=" %%A IN ('DIR /S /B /A-D *_*.*') DO FOR /F "TOKENS=1*DELIMS=_" %%B IN ("%%~NA") DO IF "%%~C" NEQ "" ECHO REN "%%~A" "%%~C%%~XA"
查看输出,如果看起来不错,请删除ECHO
。
标准的Windows Shell没有正则表达式功能,实际上它是非常基础的。 但是您可以使用powershell来执行此操作。
我对power shell不太熟悉,但是另一个问题说明了如何过滤文件: 使用powershell查找与两个单独的正则表达式匹配的文件
新解决方案
使用我的新混合JScript / batch命令行实用程序JREN.BAT ,有一个非常简单的解决方案,可通过正则表达式搜索和替换来重命名文件和文件夹。
仅重命名带有下划线的文件:
jren "^[^_]+_([^_]+\.png)$" "$1" /s /i
在第一个下划线之后保留所有内容:
jren "^.*?_" "" /s /fm "*.png"
在最后一个下划线之后保留所有内容:
jren "^.*_" "" /s /fm "*.png"
================================================== =======
原始答案
可以使用称为REPL.BAT的混合JScript / batch实用程序完成此操作,该实用程序执行regex搜索并在stdin上进行替换,并将结果写入stdout。 以下所有解决方案均假定REPL.BAT在PATH中。
我故意将ECHO置于ON,以便您获得已执行的重命名命令的日志。 如果您遇到名称冲突,这一点尤其重要:两个不同的起始名称都可以折叠为相同的新名称。 只有第一个重命名会成功-第二个重命名会失败,并显示一条错误消息。
我有三种解决方案,它们仅在处理包含多于1个_
字符的名称方面有所不同。
此解决方案将仅重命名名称中恰好带有_
文件(不考虑扩展名)。 诸如a_b_c_d.txt
类的a_b_c_d.txt
将被忽略。
@echo on&@for /f "tokens=1,2 delims=*" %%A in (
'2^>nul dir /b /s /a-d *_* ^| repl ".*\\[^_\\]*_([^_\\]*\.[^.\\]*)$" "$&*$1" a'
) do ren "%%A" "%%B"
下一个解决方案将保留最后一个_
之后的名称。 像a_b_c_d.txt
这样的名称将变成d.txt
@echo on&@for /f "tokens=1,2 delims=*" %%A in (
'2^>nul dir /b /s /a-d *_* ^| repl ".*_([^\\_.]*\.[^.\\]*)$" "$&*$1" a'
) do echo ren "%%A" "%%B"
最后一个解决方案将保留第一个_
之后的名称。 像a_b_c_d.txt
这样的名称将成为b_c_d.txt
。 这应该得到与Endoro答案相同的结果。
@echo on&@for /f "tokens=1,2 delims=*" %%A in (
'2^>nul dir /b /s /a-d *_* ^| repl ".*\\[^\\]*?_([^\\]*\.[^.\\]*)$" "$&*$1" a'
) do echo ren "%%A" "%%B"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.