Script em lote

Script em lote

Estou tentando classificar um diretório de arquivos com algumas condições, mas não consigo descobrir isso. Aqui está um pequeno exemplo de alguns nomes de arquivos que devem ser classificados (excluídos).

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

Estou tentando manter uma edição de cada arquivo, mas há um problema que torna isso difícil. No caso acima eu gostaria de manter os arquivos "Gex 64" e "NBA Jam" porque eles são os únicos lá. O "Turok" e o "Duke Nukem" tiveram duas edições cada, EUA e Europa, e aqui quero ficar apenas com as da Europa.

Não posso fazer isso manualmente porque estamos falando de milhares de arquivos. Existe um software para isso ou a linha de comando é poderosa o suficiente para que um arquivo em lote faça isso?

Responder1

Script em lote

O script pode lidar com múltiplas extensões e será padronizado para o diretório atual se nenhuma for especificada no primeiro parâmetro.

ObservaçãoNo estado em que se encontra, o script apenas listará os arquivos que devem ser excluídos, mas na verdade não os excluirá. Quando tiver certeza de que a lista está correta, substitua a REM del /f "%%~B"linha da :deleteDuplicatessub-rotina por del /f "%%~B". Trabalhe primeiro em uma cópia para garantir que não haja 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

Como funciona

  1. Obtenha uma lista de todos os arquivos que correspondem às extensões especificadas, substituindo (Europepor $(em seus nomes.
  2. Classifique a lista de arquivos em ordem alfabética.
  3. Crie uma lista de arquivos semelhantes comparando seus nomes.
  4. Liste e exclua as duplicatas encontradas.

Limitações conhecidas

  • O script assume que não há parênteses, exceto no final do nome do arquivo (por exemplo, Something (Whatever).ext).
  • Os espaços iniciais anteriores (são levados em consideração.
  • O $caractere é reservado para fins de classificação e não deve aparecer nos nomes dos arquivos.

informação relacionada