ในโฟลเดอร์ที่ระบุฉันจะลบทุกอย่างซ้ำ ๆ ยกเว้นไฟล์“ .mkv” และ“ .nfo” ได้อย่างไร


2

ฉันพยายามที่จะคิดออกรหัสสำหรับชุดไฟล์ (Windows) ที่ในโฟลเดอร์ที่ระบุซ้ำลบทุกอย่างยกเว้นไฟล์ที่มีนามสกุลบางอย่าง (เช่น.mkvและ.nfo)?

บางอย่างเช่นนี้ แต่สำหรับข้างต้น

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) } }

คุณใช้ระบบปฏิบัติการอะไร?
Sekhemty

ฉันใช้ Windows
David Custer

2
นี่ไม่ใช่แบทช์คุณกำลังมองหาอะไรอยู่?
Endoro

ฉันจะใช้ SABnzbd ที่มีฟังก์ชั่นบัญชีดำสำหรับส่วนขยาย (หรือเรียกว่ารายการล้างข้อมูล) แต่ไม่มีฟังก์ชั่นบัญชีขาว น่าเสียดายที่รายการสิ่งที่คุณไม่ต้องการ (บัญชีดำ) นั้นไม่ จำกัด และรายการสิ่งที่คุณต้องการ (รายการที่อนุญาต) เป็นเวลาที่ใช้เพียงสองรายการ (หรือมากกว่านั้น) ขึ้นอยู่กับหมวดหมู่ ดังนั้นฉันกำลังมองหาชุดรหัสบางอย่างที่จะ "ในโฟลเดอร์ที่ระบุซ้ำลบทุกอย่างยกเว้นรายการส่วนขยายเช่น. mkv .nfo"
David Custer

@DavidCuster ฉันสามารถแนะนำ Bash script สำหรับ Linux แต่ฉันไม่ใช่ผู้เชี่ยวชาญในคำสั่ง CLI สำหรับ Windows
Sekhemty

คำตอบ:


3

ต่อไปนี้เป็นวิธีด่วนในการทำสิ่งนี้ในหลาย ๆ

@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

รัน dir ทดสอบก่อนด้วยไฟล์สองสามไฟล์ที่คุณต้องการเก็บไว้และไฟล์อื่น ๆ ที่คุณต้องการลบก่อนที่จะคลาย dir หลักของคุณ หากคุณต้องการไฟล์ชุดเพื่อขอการยืนยันการลบสำหรับทุกไฟล์เปลี่ยนไปdel. /s /qdel. /s /p


หากคุณต้องการที่จะกำจัดของ dirs ที่ว่างเปล่าเช่นกันแล้วก่อนที่จะ:Endสายแทรกดังต่อไปนี้ ( RDไม่ปกติลบ dirs for /r %%a in (.) do rd "%%~a"ไม่ว่างเปล่า):
Karan

1
คุณช่างน่าอัศจรรย์! Karan เป็นฮีโร่ของฉันเขาได้ช่วยฉันในโพสต์อื่นด้วย
David Custer

ฉันเพิ่มการลบ dirs ที่ไม่ว่างเปล่าต่อการสอนของคุณ ที่สมบูรณ์แบบ!
David Custer

1

นี่เป็นวิธีอื่นโดยไม่จำเป็นต้องเปลี่ยนแอททริบิวดูที่เอาท์พุท & เอาออกechoถ้าตกลง:

@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
)

;) ดีที่สุดของคุณ! คุณกำลังบอกว่านี่เป็นวิธีที่ดีกว่า ในความคิดของคุณ?
David Custer

หากคุณเปลี่ยนคุณลักษณะเป็นแบบอ่านอย่างเดียวคุณจะต้องตั้งค่ากลับมาหลังจากลบไฟล์อื่น ๆ (มิฉะนั้น MKV / NFO ทั้งหมดจะอ่านได้อย่างเดียว ) และคุณไม่สามารถใช้คุณสมบัติสำหรับสิ่งอื่น ๆ ได้เนื่องจากสถานะก่อนหน้านี้ไม่ได้ถูกกู้คืน
Endoro

มันไม่ได้ลบอะไรเลยจริงๆ hmmmm
David Custer

1
ใช่คุณต้องลบคำechoก่อน .......
Endoro

LOLOLOL OOps -.-
David Custer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.