我正在尝试根据某些条件对文件目录进行排序,但我无论如何也想不通。下面是一些需要排序(删除)的文件名的小示例。
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
批处理脚本
该脚本可以处理多个扩展,如果第一个参数中未指定,则默认为当前目录。
笔记照原样,脚本只会列出应删除的文件,但实际上不会删除它们。当您确定列表正确时,将子例程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
怎么运行的
- 获取与指定扩展名匹配的所有文件的列表,并在其名称中替换
(Europe
为。$(
- 按字母顺序对文件列表进行排序。
- 通过比较文件名称来建立类似文件的列表。
- 列出并删除找到的重复项。
已知限制
- 该脚本假定除文件名末尾外没有括号(例如
Something (Whatever).ext
)。 - 之前的前导空格
(
会被考虑进去。 - 该
$
字符保留用于排序目的,它根本不应该出现在文件名中。