【问题标题】:Batch file to rename specific files, exclude specific files in multiple folders批处理文件重命名特定文件,排除多个文件夹中的特定文件
【发布时间】:2017-11-14 19:49:25
【问题描述】:

美好的一天,

我有一个文件夹,其中包含电影文件夹。在每个文件夹中,都有视频文件,.srt 用于字幕,jpg 用于海报,最后我包括了该电影的预告片。

我想要一个批处理文件:

  1. 将我所有的“.mp4 .mkv .avi”电影文件以及“.srt”重命名为其文件夹名称(因为我将我的文件夹重命名为“搏击俱乐部 (1999)[1080p]),所以电影文件和 .srt 将同名,当然它是扩展名)。

  2. 将所有 *.jpeg *.jpg *.png 重命名为“poster.jpg 或 poster.png”。

  3. 将所有预告片文件重命名为“Trailer.mp4。我为每部电影添加了预告片,每当您下载一部电影时,我都想删除诸如“---搏击俱乐部 - #TBT 预告片 - 20th 之类的凌乱文件名Century FOX”,然后将其转换为“Trailers.mp4”。

  4. 排除重命名那些已经具有“预告片”文件名的文件。

每个文件夹名称将如下所示: 搏击俱乐部 (1999)[1080p].mp4, 搏击俱乐部 (1999)[1080p].srt, 搏击俱乐部 (1999)[1080p].nfo, poster.jpg, Trailer.mp4.

我做了这个,但我遇到了这些:

  1. 我无法将凌乱的预告片文件重命名为“Trailer.mp4”。
  2. 无法跳过重命名“Trailer.mkv”,它重命名为文件夹名称。

请帮忙,非常感谢。

@echo off
setlocal EnableDelayedExpansion


cd /D "%~DP0"
echo BASE FOLDER: %cd%
set n=0
for /D %%a in (*) do (
set /A n+=1
cd "%%a"
echo ==================================================================
echo Processing folder: %%a
set movieName=%%~a

except (*Trailer.mp4)
except (*Trailer.mkv)

for %%b in (*.avi *.mp4 *.mkv) do (
   ren "%%~b" "!movieName!%%~Xb"
   echo Movie file "%%b" renamed to "!movieName!%%~Xb"


for %%b in (*.srt *.sub *.ass *.ssa *.idx) do (
   ren "%%~b" "!movieName!%%~Xb"
   echo File "%%b" renamed to "!movieName!%%~Xb"
)

for %%b in (*.jpeg *.jpg *.png) do (
   ren "%%~b" "!poster.jpg"
echo File "%%b" renamed to "!poster.jpg~Xb"
)

for fname in *Trailer; do
   newname=`echo "$fname" | sed 's/Trailer/Trailer/g'`
   sed 's/Trailer/Trailer/g' "$fname" >"$newname"
done

cd ..

)
echo ==================================================================

【问题讨论】:

  • 使用更好的编辑器(如 notepad++ )正确缩进代码。第一个 for 没有右括号。最后一个是不清楚的 bash 代码。 sed 用自己替换一个单词两次?
  • 要查找预告片,您可以使用 *Trailer*.avi、*Trailer*.mp4、*Trailer*.mkv 等模式,假设它们的文件名中都有 Trailer 一词;无论如何,您应该先搜索它们并将它们重命名为Trailer.*;然后你可以处理电影文件,所有那些不命名为Trailer.*的;将if /I not "%%~nb"=="Trailer" ( ... ) 放入第一个循环以排除已重命名的文件Trailer.*...

标签: batch-file cmd file-rename


【解决方案1】:

也许这会有所帮助:

@echo off
setlocal EnableDelayedExpansion

cd /D "%~dp0"
echo BASE FOLDER: %cd%
set n=0
for /D %%a in (*) do (
    set /A n+=1
    PushD "%%a"
    echo ==================================================================
    echo Processing folder: %%a
    set "movieName=%%~a"

    rem except (*Trailer.mp4),except (*Trailer.mkv)
    for /f "delims=" %%b in (
      'dir /B *.avi *.mp4 *.mkv ^|findstr /i /v "Trailer" '
    ) do (
       ren "%%~b" "!movieName!%%~Xb" && ^
       echo Movie file "%%b" renamed to "!movieName!%%~Xb"
    )

    for %%b in (*.srt *.sub *.ass *.ssa *.idx) do (
       ren "%%~b" "!movieName!%%~Xb"&& ^
       echo File "%%b" renamed to "!movieName!%%~Xb"
    )

    for %%b in (*.jpeg *.jpg *.png) do (
        ren "%%~b" "poster%%~xb" && ^
        echo File "%%b" renamed to "poster%%~xb"
    )

    for /f "delims=" %%b in (
      'dir /B "*trailer*" '
    ) do (
       ren "%%~b" "Trailer%%~Xb" && ^
       echo Movie file "%%b" renamed to "Trailer%%~Xb"
    )
    PopD
)
echo ==================================================================

【讨论】:

  • 非常感谢您的回复。它正在工作,但是,我尝试了一个场景,其中有 2 个文件在其文件名上具有“预告片”,具有不同的文件扩展名,它能够按预期进行,但将第二个“预告片”重命名为文件夹名称,即电影名称。您能否编辑批处理文件,以便在类似的情况下,“预告片”的两个文件(mkv 和 mp4)版本都被重命名,而不是以文件夹名称命名......非常感谢您的积极响应。
  • 在第一个 findstr /v 中,仅排除了带有尾随 Trailer 一个文字点和以 m 开头的扩展名的文件,已更改。现在排除任何位置的包括Trailer 在内的任何文件,稍后将缩短为仅 Trailer.ext
  • 非常感谢....现在我手头有一个非常强大的重命名工具...祝福你兄弟。愿你有一个美好的一天...
  • 嗯,获得感谢的首选方式是接受答案和/或投票。
猜你喜欢
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多