Мой вышестоящий хост изменил способ отправки видеофайлов, и теперь у меня есть десятки папок, которые содержат как MP4, так и MKV-версию одного и того же файла. Я хочу сохранить файл MKV более высокого качества и удалить версию MP4, но слишком много нужно сделать вручную, плюс, вероятно, это будет повторяться до тех пор, пока я его не исправлю.

Итак, я хотел бы запустить скрипт / пакетный файл, который в основном рекурсивно просматривает все подкаталоги в каталоге, в котором я его запускаю, говорит, что if exist <filename>.mkv, delete <filename>.* unless <filename>.nfo

Файлы находятся на NAS-сервере с поддержкой Unraid, так что я могу подключиться и использовать Linux непосредственно на компьютере, или я могу использовать Ubuntu или Windows-машину, чтобы сделать это через сетевой ресурс, так что я довольно гибок в том, где / как это работает

Заранее благодарю за любую помощь в этом. Я рвал на себе волосы, гуглил, чтобы посмотреть, смогу ли я найти решение, но подхожу пустым.

1 ответ1

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
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .