배치 스크립트

배치 스크립트

몇 가지 조건을 사용하여 파일 디렉터리를 정렬하려고 하는데 평생 동안 이것을 알아낼 수 없습니다. 다음은 정렬(삭제)해야 할 일부 파일 이름의 작은 예입니다.

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"은 각각 미국과 유럽의 두 가지 버전이 있는데 여기서는 유럽 버전만 유지하고 싶습니다.

수천 개의 파일에 대해 이야기하고 있기 때문에 이 작업을 수동으로 수행할 수 없습니다. 이를 위한 소프트웨어가 있습니까? 아니면 배치 파일이 이 작업을 수행할 수 있을 만큼 강력한 명령줄이 있습니까?

답변1

배치 스크립트

스크립트는 여러 확장을 처리할 수 있으며 첫 번째 매개변수에 아무것도 지정되지 않은 경우 현재 디렉터리가 기본적으로 사용됩니다.

메모있는 그대로 스크립트는 삭제해야 할 파일을 나열할 뿐 실제로 삭제하지는 않습니다. 목록이 정확하다고 확신하면 서브루틴 REM del /f "%%~B"의 줄을 . 문제가 없는지 확인하려면 먼저 사본을 작업하세요.:deleteDuplicatesdel /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).
  • 이전 공백이 (고려됩니다.
  • $문자는 정렬 목적으로 예약되어 있으므로 파일 이름에 전혀 표시되어서는 안 됩니다.

관련 정보