如何根据条件递归批量重命名文件

How to batch rename files recursively based on conditions

过去几个小时我一直在搜索,但找不到执行此操作的简单方法。

场景:

PARENT_FOLDER  
----YEAR_FOLDER  
--------MOVIE1_FOLDER  
----------Movie1_Title.Ext  
----------Eng.Srt  
--------MOVIE2_FOLDER  
----------Movie2_Title.Ext  
----------02_ENG.SRT  
----------03_ENG.SRT  
--------MOVIE3_FOLDER  
----------Movie3_Title.Ext  
----------ENG.SRT  
----------ENG-SDH.SRT  
--------MOVIE4_FOLDER  
----------Movie4_title.ext  
----------Movie4.Randomstuff.SRT  
--------MOVIE5_FOLDER  
----------Movie5_title.ext  
----------randomstuff.eng.srt 

我想找到一些方法来创建批处理脚本以递归地遍历并将 SRT 文件重命名为 VIDEO 文件(AVI、MKV 或 MP4)的名称。 如果有 2 个,我想尽可能使用最大的一个,或者如果 SRT 名称有一个 SDH 将其添加到末尾 (Movie_Title.SDH.srt)。

我试过:

@echo off  
if exist "*SDH.srt" (  
for %%f in ("*.avi") do ren *.srt "%%~nf.SDH.srt"  
) else (  
for %%f in ("*.avi") do ren *.srt "%%~nf.srt"  
) 
for %%f in ("*.avi") do ren *.srt "%%~nf.srt" 

最后一行是如果有第二个文件就获取第二个文件(我也试过没有它)......这根本不起作用。我有 2 个文件,一个带有 SDH,但没有正确重命名。

唯一有效的是:

for %%f in ("*.avi") do ren *.srt "%%~nf.srt" 

它只重命名了找到的第一个,并且必须在目录中 运行。我在 "for" 之后添加了 /R 但它不会递归工作。我试图将其分解并使用示例目录和文件名分步进行,但这只会让脑损伤达到一个全新的水平。
我什至接近让它工作了吗?

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
FOR /d /r "%sourcedir%" %%a IN (*) DO (
 REM %%a contains directory name. Look for movie file
 FOR %%x IN (mkv avi mp4) DO (
  IF EXIST "%%a\*.%%x" FOR %%m IN ("%%a\*.%%x") DO (
   REM Look for *SDH.SRT file
   IF EXIST "%%a\*SDH.SRT" (ECHO REN "%%a\*SDH.SRT" "%%~nmSDH.SRT"
   ) ELSE (
    SET "renamed="
    FOR /f "delims=" %%s IN ('dir /b /a-d /o-s "%%a\*.srt"') DO IF NOT DEFINED renamed (
     ECHO REN "%%a\%%s" "%%~nm.SRT"
     SET "renamed=Y"
    )
   )
  )
 )
)

GOTO :EOF

您需要更改 sourcedir 的设置以适合您的情况。

所需的 REN 命令仅 ECHOed 用于测试目的。 确认命令正确后,将 ECHO REN 更改为 REN 以实际重命名文件。

首先 运行 递归扫描目录名称到 %%a。找到每个目录后,在 %%x 中查找所需的扩展之一(我假设任何目录中只有一个),如果存在,则将 %%m 设置为其名称。

在所在目录中查找*SDH.SRT,如果存在,则在SDH.SRT之前重命名为%%m的名称部分。如果没有 *SDH.SRT 文件,清除 renamed 标志,然后以相反大小的顺序对目录中的 *.srt 文件名执行目录扫描,因此最大的文件列在最前面。 for/f将依次找到的文件名完整赋值给%%s,这样就可以重命名需要的largest-.srt文件,然后将renamed标志设置为一个值,这样就变成了已定义,因此在目录中找到的其他 *.srt 个文件将 不会 重命名。

我故意使用名称中包含空格的目录进行测试,因此 file/directorynames 包含空格的处理似乎是正确的。我不会对丢失的 *.srt 文件或包含有毒字符的文件名可能造成的后果发表评论。