Jak mogę rekurencyjnie usunąć wszystko w określonym folderze oprócz plików „.mkv” i „.nfo”?

2

Próbuję ustalić kod pliku wsadowego (Windows), który w określonym folderze rekurencyjnie usuwa wszystko oprócz plików z określonym rozszerzeniem (tj. .mkvI .nfo)?

Coś w tym stylu, ale powyżej.

def deleteRootFolder = tryQuietly{ root.toBoolean() }

/*
 * Delete orphaned "clutter" files like nfo, jpg, etc and sample files
 */
def isClutter(f) {
    def exts    = tryQuietly{ exts }            ?: /jpg|jpeg|png|gif|nfo|xml|htm|html|log|srt|sub|idx|md5|sfv|txt|rtf|url|db|dna|log/
    def terms   = tryQuietly{ terms }           ?: /sample|trailer|extras|deleted.scenes|music.video|scrapbook/
    def maxsize = tryQuietly{ maxsize as Long } ?: 100 * 1024 * 1024

    // path contains blacklisted terms or extension is blacklisted
    return (f.extension ==~ "(?i)($exts)" || f.path =~ "(?i)\\b($terms)\\b") && f.length() < maxsize
}


def clean(f) {
    println "Delete $f"

    // do a dry run via --action test
    if (_args.action == 'test') {
        return false
    }

    return f.isDirectory() ? f.deleteDir() : f.delete()
}


// delete clutter files in orphaned media folders
args.getFiles{ isClutter(it) && !it.dir.hasFile{ (it.isVideo() || it.isAudio()) && !isClutter(it) }}.each { clean(it) }

// delete empty folders but exclude given args
args.getFolders().sort().reverse().each { if (it.listFiles().length == 0) { if (deleteRootFolder || !args.contains(it)) clean(it) } }
David Custer
źródło
Z jakiego systemu operacyjnego korzystasz?
Sekhemty
Korzystam z systemu Windows.
David Custer
2
To nie jest partia, czego szukasz?
Endoro
Użyjemy SABnzbd, który ma funkcję czarnej listy dla rozszerzeń (inaczej znaną jako lista czyszczenia), ale nie ma funkcji białej listy. Niestety lista rzeczy, których nie chcesz (czarna lista) jest nieograniczona, a lista tego, czego chcesz (biała lista) jest często dwa razy (w zależności od kategorii). Szukam więc kodu wsadowego, który „W określonym folderze rekursywnie usuwa wszystko oprócz listy rozszerzeń, tj. .Mkv .nfo”
David Custer
@DavidCuster Mógłbym zasugerować ci prosty skrypt Bash dla Linuksa, ale nie jestem ekspertem od poleceń CLI dla systemu Windows.
Sekhemty

Odpowiedzi:

3

Oto jeden szybki sposób na wykonanie tego wśród wielu:

@echo off
set extlist=mkv nfo
set rootfolder="C:\Video Folder"
pushd %rootfolder%
if not ["%cd%"]==[%rootfolder%] echo Aborting as unable to change to %rootfolder% && goto End
attrib /s /d -r
for %%a in (%extlist%) do attrib /s *.%%a +r
del. /s /q
:End
popd

Najpierw uruchom katalog testowy z kilkoma plikami, które chcesz zachować, i innymi, które chcesz usunąć, a następnie uruchom główny katalog. Jeśli chcesz, aby plik wsadowy żądał potwierdzenia usunięcia każdego pliku, zmień del. /s /qna del. /s /p.

Karan
źródło
Jeśli chcesz pozbyć się pustych katalogów, jak również, a następnie przed :Endlinią wstawić następujący ( rd normalnie nie usuwać niepuste katalogi) for /r %%a in (.) do rd "%%~a".
Karan
1
JESTEŚ NIESAMOWITY! Karan jest moim bohaterem, uratował mnie również na innych stanowiskach.
David Custer
Dodałem usunięcie niepustych katalogów dla każdego samouczka. DOSKONAŁY!
David Custer
1

jest to inny sposób bez potrzeby zmiany atrybutów, spójrz na dane wyjściowe i usuń echo, jeśli OK:

@echo off &setlocal
set "extlist=.mkv|.nfo|"
for /r "c:\video" %%i in (*) do (
    set "fname=%%~i"
    setlocal enabledelayedexpansion
    if "!extlist:%%~xi|=!"=="%extlist%" echo del "!fname!"
    endlocal
)
Endoro
źródło
;) Twój najlepszy! Mówisz, że to lepszy sposób? Twoim zdaniem?
David Custer
Jeśli zmienisz atrybuty na tylko do odczytu , musisz usunąć je po usunięciu innych plików (w przeciwnym razie wszystkie MKV / NFO pozostaną tylko do odczytu ). Nie można używać atrybutów do innych celów, ponieważ poprzedni stan nie został przywrócony.
Endoro
W rzeczywistości nic nie usuwa. Hmmmm
David Custer
1
Tak, musisz usunąć słowo echoprzed .......
Endoro
LOLOLOL OOps -.-
David Custer