いくつかの条件でファイルのディレクトリを並べ替えようとしているのですが、どうしてもわかりません。並べ替え (削除) するファイル名の簡単な例を以下に示します。
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
各ファイルのエディションを 1 つずつ保持しようとしていますが、難しい問題があります。上記のケースでは、「Gex 64」と「NBA Jam」のファイルだけなので、この 2 つのファイルを保持したいと思います。「Turok」と「Duke Nukem」にはそれぞれ USA 版とヨーロッパ版の 2 つのエディションがあり、ここではヨーロッパ版だけを保持したいと思います。
数千のファイルを扱うので、手動でこれを行うことはできません。これを行うためのソフトウェアはありますか? または、バッチ ファイルでこれを行うのに十分なコマンド ライン機能がありますか?
答え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
)。 - 先頭のスペース
(
が考慮されます。 - この
$
文字はソートの目的で予約されており、ファイル名には一切使用しないでください。