ลบไฟล์ที่มีชื่อไฟล์เกือบเหมือนกันยกเว้นคำสุดท้าย (Windows)


0

ฉันพยายามจัดเรียงไดเรกทอรีของไฟล์ด้วยเงื่อนไขบางอย่าง แต่ฉันทำไม่ได้ตลอดชีวิตของฉัน นี่คือตัวอย่างเล็กน้อยของชื่อไฟล์บางส่วนที่จะถูกแยกออก (ลบ)

Turok 3 - Shadow of Oblivion (USA).zip
Turok 3 - Shadow of Oblivion (Europe).zip
Duke Nukem - Zero Hour (Europe).zip
Duke Nukem - Zero Hour (USA).zip
Gex 64 - Enter the Gecko (Europe).zip
NBA Jam 2000 (Europe).zip

ฉันพยายามเก็บแต่ละไฟล์ไว้หนึ่งฉบับ แต่มีสิ่งที่ทำให้มันยาก ในกรณีข้างต้นฉันต้องการเก็บไฟล์ "Gex 64" และ "NBA Jam" เพราะเป็นไฟล์เดียวเท่านั้น "Turok" และ "Duke Nukem" มีสองรุ่นแต่ละรุ่นคือสหรัฐอเมริกาและยุโรปและที่นี่ฉันต้องการเก็บเฉพาะยุโรปเท่านั้น

ฉันไม่สามารถทำได้ด้วยตนเองเพราะเรากำลังพูดถึงไฟล์หลายพันไฟล์ มีซอฟต์แวร์สำหรับสิ่งนี้หรือบรรทัดคำสั่งมีประสิทธิภาพเพียงพอที่จะมีไฟล์แบตช์ทำสิ่งนี้หรือไม่?


ทำซ้ำชื่อไฟล์ทั้งหมดลงท้ายด้วย (USA) หรือ (Europe)?
and31415

ไม่ แต่ฉันสามารถคัดลอกไฟล์ (USA) และ (ยุโรป) ไปยังไดเรกทอรีอื่นด้วยวิธีนี้ไฟล์ทั้งหมดจะลงท้ายด้วยแท็กเหล่านี้
Nick Semante

ดังนั้นคุณสนใจ แต่เพียงผู้เดียวในตอนจบเท่านั้น?
and31415

ใช่ถูกต้อง. บางทีฉันอาจจะเขียนโปรแกรมอย่างง่ายใน Basic แต่เป็นเวลาหลายปีแล้วที่ฉันใช้มัน ต้องการตัวเลือกที่ง่ายกว่านี้จริงๆ
Nick Semante

เอาล่ะ ในการสรุป: สมมติว่ามีไฟล์จำนวนมากซึ่งลงท้ายด้วย (USA) หรือ (Europe). บางคนใช้ชื่อเดียวกันแม้ว่าพวกเขาจะถูกกำหนดเป้าหมายในภูมิภาคอื่น ไฟล์ที่ไม่ซ้ำกันควรถูกเก็บไว้ไม่ว่าจะเกิดอะไรขึ้น แต่ควรจัดการชื่อที่ซ้ำกันเพื่อให้มีเฉพาะ (Europe) เวอร์ชันถูกเก็บรักษาไว้ ถูกต้องไหม
and31415

คำตอบ:


0

สคริปต์ชุด

สคริปต์สามารถจัดการส่วนขยายหลายรายการและจะใช้ค่าเริ่มต้นเป็นไดเรกทอรีปัจจุบันหากไม่มีการระบุไว้ในพารามิเตอร์แรก

บันทึก ตามที่เป็นอยู่สคริปต์จะแสดงรายการไฟล์ที่ควรลบ แต่จะไม่ลบออกจริง เมื่อคุณแน่ใจว่ารายการถูกต้องให้แทนที่ REM del /f "%%~B" บรรทัดใน :deleteDuplicates รูทีนย่อยด้วย del /f "%%~B". ทำสำเนาก่อนเพื่อให้แน่ใจว่าไม่มีปัญหา

@echo off
setlocal
setlocal enabledelayedexpansion

REM ensure the target directory exists
if "%~1" == "" (
set targetDir=%~dp0
) else (
if not exist "%~1\" exit /b 2
set targetDir=%~1
)

REM set the working directory
pushd "%targetDir%"

REM set the file extensions to scan
set exts=*.zip
set preserve=^(Europe

REM initialize the name list
set nameList=%temp%\names_%random%%random%.txt

REM retrieve all file names
type nul>"%nameList%"
for /r %%G in (%exts%) do (
set name=%%~nG
set name=!name:%preserve%=$^(!
echo !name!%%~xG>>"%nameList%"
)

REM delete duplicates with similar names
call :deleteDuplicates "%nameList%"

del "%nameList%" 2>nul
popd
endlocal
echo. & pause
exit /b

:deleteDuplicates
setlocal
set tempFile=%~dp1tmp-%~nx1
sort "%~1" /o "%tempFile%"
type nul>"%~1"
set last=
for /f "delims=" %%A in (%tempFile%) do (
for /f "tokens=1 delims=$(" %%B in ('echo %%A') do (set current=%%B)
if "!current!" == "!last!" (
echo %%~A>>"%~1"
) else (
set last=!current!
))
for /f "delims=" %%A in (%~1) do (
for /f "delims=" %%B in ('"dir /b /s "%%~A" 2>nul"') do (
echo %%B
REM del /f "%%~B"
))
del "%tempFile%" 2>nul
endlocal & exit /b

มันทำงานอย่างไร

  1. รับรายการของไฟล์ทั้งหมดที่ตรงกับนามสกุลที่ระบุแทนที่ (Europe กับ $( ในชื่อของพวกเขา
  2. เรียงลำดับรายการไฟล์ตามตัวอักษร
  3. สร้างรายการของไฟล์ที่คล้ายกันโดยการเปรียบเทียบชื่อของพวกเขา
  4. แสดงรายการและลบรายการซ้ำที่พบ

ข้อ จำกัด ที่รู้จัก

  • สคริปต์จะถือว่าไม่มีวงเล็บยกเว้นในตอนท้ายของชื่อไฟล์ (เช่น Something (Whatever).ext )
  • นำช่องว่างมาก่อน ( ถูกนำมาพิจารณา
  • $ อักขระถูกสงวนไว้สำหรับวัตถุประสงค์ในการจัดเรียงและไม่ควรปรากฏในชื่อไฟล์เลย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.