Я пытаюсь отсортировать каталог файлов с некоторыми условиями, но я не могу на всю жизнь понять это. Вот небольшой пример некоторых имен файлов, которые должны быть отсортированы (удалены).

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 ответ1

0

Пакетный скрипт

Сценарий может обрабатывать несколько расширений и по умолчанию будет использовать текущий каталог, если ни один из них не указан в первом параметре.

Примечание. Как есть, скрипт будет просто перечислять файлы, которые должны быть удалены, но фактически не удалит их. Если вы уверены, что список правильный, замените строку REM del /f "%%~B" в подпрограмме :deleteDuplicates на del /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).
  • Ведущие пробелы перед ( принимаются во внимание.
  • Символ $ зарезервирован для целей сортировки и вообще не должен появляться в именах файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .