Excluir arquivos com 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 consigo descobrir isso por toda a vida. Aqui está um pequeno exemplo de alguns nomes de arquivos que devem ser resolvidos (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" têm duas edições cada, EUA e Europa, e aqui quero manter apenas 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 lotes faça isso?

Nick Semante
fonte
Todos os nomes de arquivos duplicados terminam com (USA)ou (Europe)?
and31415
Bem, não, mas posso copiar os arquivos (EUA) e (Europa) para outro diretório, assim todos os arquivos terminarão com essas tags.
Nick Semante
Então você só está interessado naqueles que terminam assim?
and31415
Sim, correto. Talvez eu pudesse escrever um programa simples no Basic, mas já faz anos desde que o usei. Preferiria realmente uma opção mais simples.
Nick Semante
Tudo certo. Para resumir: vamos supor que há muitos arquivos, que terminam com (USA)ou (Europe). Alguns deles compartilham o mesmo nome, embora sejam direcionados para uma região diferente. Arquivos únicos devem ser mantidos, não importa o que aconteça, mas nomes duplicados devem ser manipulados para que apenas a (Europe)versão seja preservada. Isso está correto?
and31415

Respostas:

0

Script em lote

O script pode manipular várias extensões e usará o diretório atual como padrão se nenhum for especificado no primeiro parâmetro.

Nota Como está, o script apenas lista os arquivos que devem ser excluídos, mas na verdade não os exclui. Quando tiver certeza de que a lista está correta, substitua a REM del /f "%%~B"linha na :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 $(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 assume que não há parênteses, exceto no final do nome do arquivo (por exemplo Something (Whatever).ext).
  • Os espaços iniciais antes (são levados em consideração.
  • O $caractere é reservado para fins de classificação e não deve aparecer nos nomes dos arquivos.
and31415
fonte