使用批处理和正则表达式重命名文件
我并没有真正搞乱批处理文件,但考虑到我们的工作环境,这是我们唯一的解决方案。使用批处理和正则表达式重命名文件
我们有以下格式一堆文件:
ICN-A10-C-1-H-8X662-00001-A-05-U
ICN-A10-C-1-H-8X662-00002-A-01-U
ICN-A10-C-1-H-8X662-00003-A-00-U
ICN-A10-C-1-H-8X662-00004-A-92-U
,我们需要去掉最后一位数字设定和下面连字符,使他们念想:
ICN-A10-C-1-H-8X662-00001-A-U
ICN-A10-C-1-H-8X662-00002-A-U
ICN-A10-C-1-H-8X662-00003-A-U
ICN-A10-C-1-H-8X662-00004-A-U
同样,* .bat文件看起来像我们唯一的解决方案。
任何帮助,非常感谢。
你可以使用这个有些怪异的技巧:
@echo off
setlocal enabledelayedexpansion
cd files
for %%a in (*) do (
set "name=%%a"
for %%b in ("!name:-=.!") do for %%c in ("%%~Nb") do (
set "newName=%%~Nc%%~Xb"
ECHO ren %%a !newName:.=-!
)
)
也就是说,通过.
改变-
和使用两个嵌套FOR命令来消除最后两个扩展。然后,重新组合的剩余名称与原来的扩展和hypens变回点:
C:\> dir /B files
ICN-A10-C-1-H-8X662-00003-A-00-U
ICN-A10-C-1-H-8X662-00002-A-01-U
ICN-A10-C-1-H-8X662-00001-A-05-U
ICN-A10-C-1-H-8X662-00004-A-92-U
C:\> test
ren ICN-A10-C-1-H-8X662-00003-A-00-U ICN-A10-C-1-H-8X662-00003-A-U
ren ICN-A10-C-1-H-8X662-00002-A-01-U ICN-A10-C-1-H-8X662-00002-A-U
ren ICN-A10-C-1-H-8X662-00001-A-05-U ICN-A10-C-1-H-8X662-00001-A-U
ren ICN-A10-C-1-H-8X662-00004-A-92-U ICN-A10-C-1-H-8X662-00004-A-U
您可以在要重命名的文件所在的目录上使用rename
命令。
rename 's/\d+-(?=\D*$)//' *
上述正则表达式将匹配数加只有当它的随后的零个或多个非数字字符以下-
符号和线锚定件的端部。
'rename'是Linux的可爱,但它没有cygwin的或的GnuWin32不是包含在Windows。 'batch-file'标签用于Windows批处理脚本。不过,我不能错误地提出你的建议。我经常ssh到我的linux系统,所以我可以通过autofs回到我的Windows文件系统,并使用Linux'rename'工具。我从来没有运气过cygwin版本。 – rojo 2014-12-05 19:34:53
是的,如果我们使用Linux。但不是。 :(正则表达式很容易。 – zedkineece 2014-12-10 15:15:04
对不起,没有正则表达式
for /f "tokens=1-11 delims=-" %%a in ('
dir /b /a-d *
') do if "%%k"=="" if not "%%j"=="" (
echo ren "%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%i-%%j" "%%a-%%b-%%c-%%d-%%e-%%f-%%g-%%h-%%j"
)
重命名操作只回显到控制台。如果输出正确,请删除echo
命令。
+2在DOS中隐藏和双重嵌套FOR循环:-) – mnemotronic 2015-07-26 16:07:43