我的上游主机改变了他们发送视频文件的方式,现在我有几十个文件夹,其中包含同一文件的 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
)