如果存在 MKV 版本,如何自动删除文件的 MP4 版本?

如果存在 MKV 版本,如何自动删除文件的 MP4 版本?

我的上游主机改变了他们发送视频文件的方式,现在我有几十个文件夹,其中包含同一文件的 MP4 和 MKV 版本。我想保留更高质量的 MKV 文件并删除 MP4 版本,但手动操作太多了,而且这种情况很可能会一直重复发生,直到我把它理顺为止。

因此,我想运行一个脚本/批处理文件,该文件基本上以递归方式查看我运行它的目录中的所有子目录,说if exist <filename>.mkv, delete <filename>.* unless <filename>.nfo

这些文件位于由 Unraid 提供支持的 NAS 上,因此我可以通过 ssh 进入并直接在机器上使用 Linux,或者可以使用 Ubuntu 或 Windows 机器通过网络共享来执行此操作,因此我可以非常灵活地控制运行位置/方式。

在此先感谢您对此提供的任何帮助。我一直绞尽脑汁,在谷歌上搜索,看能否找到解决方案,但一无所获。

答案1

将以下内容放入 .cmd 文件(或 .bat 文件)中,然后在您想要开始扫描和删除重复视频文件的根/基目录中执行它。

该脚本将删除同一目录中与 .mkv 文件同名的所有文件。但是,它不会删除任何 .nfo 文件。

此外,该脚本还以递归方式对所有子目录应用相同的过程。

注意 的用法setlocal。该脚本使用了延迟环境变量扩展。然而,这存在吞掉可能是变量内容一部分的感叹号的问题。为了防止这种不必要的感叹号消除,延迟环境变量扩展仅在必要时启用。

@echo off
setlocal enableextensions disabledelayedexpansion

echo Processing directory: "%CD%"

rem The outer for-loop goes through all ".mkv" files in the current folder.
rem The inner for-loop goes through all files with the same base file name
rem as the ".mkv" file and deletes them if its file extension is
rem neither ".mkv" nor ".nfo".

for %%i in (*.mkv) do (
    set BaseFileName=%%~ni

    setlocal enabledelayedexpansion

    for %%j in ("!BaseFileName!.*") do (
        set FileExtension=%%~xj
        if /i {!FileExtension!} neq {.mkv} if /i {!FileExtension!} neq {.nfo} (

            setlocal disabledelayedexpansion

            echo Deleting %%j
            del /q /f "%%j"

            endlocal
        )
    )

    endlocal
)

rem This for-loop is responsible for the recursion into sub directories.

set BatchFileAbsolutePath=%~df0
for /d %%i in (*.*) do (
    pushd "%%i"
    call "%BatchFileAbsolutePath%"
    popd
)

相关内容