secuencia de comandos por lotes

secuencia de comandos por lotes

Estoy tratando de ordenar un directorio de archivos con algunas condiciones, pero por mi vida no puedo resolver esto. Aquí hay un pequeño ejemplo de algunos nombres de archivos que deben ordenarse (eliminarse).

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

Intento conservar una edición de cada archivo, pero hay un problema que lo dificulta. En el caso anterior, me gustaría conservar los archivos "Gex 64" y "NBA Jam" porque son los únicos que existen. El "Turok" y el "Duke Nukem" tuvieron dos ediciones cada uno, Estados Unidos y Europa, y aquí quiero quedarme solo con las europeas.

No puedo hacer esto manualmente porque estamos hablando de miles de archivos. ¿Existe algún software para esto o la línea de comandos es lo suficientemente potente como para que un archivo por lotes haga esto?

Respuesta1

secuencia de comandos por lotes

El script puede manejar múltiples extensiones y se establecerá de forma predeterminada en el directorio actual si no se especifica ninguna en el primer parámetro.

NotaTal como está, el script simplemente enumerará los archivos que deben eliminarse, pero en realidad no los eliminará. Cuando esté seguro de que la lista es correcta, reemplace la REM del /f "%%~B"línea en la :deleteDuplicatessubrutina con del /f "%%~B". Trabaje primero en una copia para asegurarse de que no haya problemas.

@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

Cómo funciona

  1. Obtenga una lista de todos los archivos que coincidan con las extensiones especificadas, reemplazándolas (Europecon $(sus nombres.
  2. Ordene la lista de archivos alfabéticamente.
  3. Cree una lista de archivos similares comparando sus nombres.
  4. Enumere y elimine los duplicados encontrados.

Limitaciones conocidas

  • El script asume que no hay paréntesis excepto al final del nombre del archivo (por ejemplo Something (Whatever).ext).
  • (Se tienen en cuenta los espacios iniciales anteriores .
  • El $carácter está reservado para fines de clasificación y no debería aparecer en ningún nombre de archivo.

información relacionada