Exclui arquivos que possuem nomes de arquivos quase idênticos, exceto a última palavra (Windows)

0

Estou tentando classificar um diretório de arquivos com algumas condições, mas não posso, para minha vida, 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 dificulta isso. No caso acima, eu gostaria de manter os arquivos "Gex 64" e "NBA Jam", porque eles são os únicos lá. O "Turok" e "Duke Nukem" tem duas edições cada, EUA e Europa, e aqui quero manter apenas as da Europa.

Eu 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 fazer um arquivo em lote fazer isso?

    
por Nick Semante 06.03.2014 / 22:30

1 resposta

0

Script em lote

O script pode manipular várias extensões e será padronizado para o diretório atual se nenhum for especificado no primeiro parâmetro.

Observação Como está, o script listará apenas os arquivos que devem ser excluídos, mas não os excluirá de fato. Quando tiver certeza de que a lista está correta, substitua a linha REM del /f "%%~B" na sub-rotina :deleteDuplicates 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 correspondentes à (s) extensão (ões) especificada (s), substituindo (Europe por $( em seus nomes.
  2. Classifique a lista de arquivos em ordem alfabética.
  3. Crie uma lista de arquivos semelhantes comparando seus nomes.
  4. Listar e excluir as duplicatas encontradas.

Limitações conhecidas

  • O script pressupõe que não há parênteses, exceto no final do nome do arquivo (por exemplo, Something (Whatever).ext ).
  • Espaços iniciais antes de ( são levados em conta.
  • O caractere $ é reservado para fins de classificação e não deve aparecer em nomes de arquivo.
por 07.03.2014 / 17:38