如何根据条件递归批量重命名文件
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 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将 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
文件或包含有毒字符的文件名可能造成的后果发表评论。
过去几个小时我一直在搜索,但找不到执行此操作的简单方法。
场景:
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 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将 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
文件或包含有毒字符的文件名可能造成的后果发表评论。