1

directoryBのレプリカとして作成されるdirectoryAがあり、一部のファイルが変更または追加されています。directoryBに冗長コピーがあるdirectoryAからすべてのファイルを削除するプロセスを自動化したいと考えています。

どちらのディレクトリにも複数のサブディレクトリ層があるため、ソリューションは再帰的になる可能性があります。

最初に考えたのはバッチ スクリプトを作成することですが、Microsoft コマンド プロンプトは初めてで、経験が限られている bash スクリプトとは大きく異なるようです。

Windows XP を使用していますが、Windows 7 でも機能するソリューションが必要です。

4

3 に答える 3

2

あなたの状況では、怠け者の方法を取り、mingwをインストールして使用します

find directoryA directoryB -type f -exec md5sum '{}' ';' |
my-bash-script

directoryB 内のファイルと同じ MD5 署名を持つ directoryA 内のすべてのファイルを検索し、それを削除します。

または、あまり怠惰ではないが mingw を必要としないソリューションを好む場合は、LuaLua POSIX ライブラリ(Windows にインストールできると思います) をインストールしてください。MD5 ライブラリをググって、すべての操作を Lua で行うことができます。これは移植可能です。また、mingw ソリューションとは異なり、誰の Windows ボックスにも簡単に展開できます。スタンドアロンのバイナリを作成できます。

于 2010-07-14T14:44:42.597 に答える
1

私は Windows にかなりの距離を置きますが、 Windows PowerShellには、お探しの強力なスクリプト機能が備わっている可能性があります( Microsoft のドキュメントも参照してください)。

PowerShell は、ファイル システムなどのエンティティに対してオブジェクト指向のアプローチを採用しています。必要なことを実行するためのスクリプトを簡単に作成できるはずですが、もちろん、最初に PowerShell について学習する必要があります。


編集: Microsoft は、Windows XP およびその他のいくつかの PowerShell のダウンロードを提供していますが、Windows 7 用のダウンロードは表示されません。ああ... Wikipedia によると、Windows 7 には既に統合されています。最新バージョンの Windows に既に搭載されています。

于 2010-07-14T13:42:23.483 に答える
1

サードパーティ製ソフトウェアのインストールを必要としないソリューションが必要な場合は、以下のスクリプトを使用してください。組み込みのコマンドライン ツールのみを使用します。

スクリプトは、最初にいくつかの一般的なエラー状態をチェックします。次に、クリーンアップ ディレクトリ内のすべてのファイルを再帰的に繰り返します。バックアップ ディレクトリに同じ名前のファイルが見つかった場合は、バイナリ比較を行ってファイルが冗長かどうかを判断します。

@echo off
rem delete files from a directory that have a redundant copy in a backup directory

setlocal enabledelayedexpansion

rem check arguments
if "%~2"=="" (
    echo.Usage: %~n0 cleanup_dir backup_dir
    echo.Delete files from cleanup_dir that have a redundant copy in backup_dir
    exit /b 1
)

set CLEANUP_DIR=%~f1
if not exist "%CLEANUP_DIR%" (
    echo."%CLEANUP_DIR%" does not exist.
    exit /b 1
)

set BACKUP_DIR=%~f2
if not exist "%BACKUP_DIR%" (
    echo."%BACKUP_DIR%" does not exist.
    exit /b 1
)

rem ensure that dirs are different
if "%CLEANUP_DIR%" == "%BACKUP_DIR%" (
    echo.backup directory must not be the same as cleanup directory.
    exit /b 1
)

rem ensure that backup_dir is not a sub dir of cleanup_dir
if not "!BACKUP_DIR:%CLEANUP_DIR%=!" == "%BACKUP_DIR%" (
    echo.backup directory must not be a sub directory of cleanup directory.
    exit /b 1
)

rem iterate recursively thru files in cleanup_dir
for /R "%CLEANUP_DIR%" %%F in (*) do (
    set FILE_PATH=%%F
    set BACKUP_FILE_PATH=!FILE_PATH:%CLEANUP_DIR%=%BACKUP_DIR%!
    if exist "!BACKUP_FILE_PATH!" (
        rem binary compare file to file in backup dir
        fc /B "!FILE_PATH!" "!BACKUP_FILE_PATH!" >NUL 2>&1
        if not errorlevel 1 (
            rem if files are identical delete file from cleanup_dir
            echo.delete redundant "!FILE_PATH!".
            del "!FILE_PATH!"
        ) else (
            echo.keep modified "!FILE_PATH!".
        )
    ) else (
        echo.keep added "!FILE_PATH!".
    )
)
于 2010-07-15T20:10:35.987 に答える