1

我有directoryA作为directoryB的副本填充,并且一些文件被更改或添加。我想自动化从 directoryA 中删除所有在directoryB中具有冗余副本的文件的过程。

这两个目录都有多层子目录,因此解决方案可能必须是递归的。

我的第一个想法是创建一个批处理脚本,但我是 microsoft 命令提示符的新手,它似乎与 bash 脚本有很大不同,我在这方面的经验有限。

我使用的是 Windows XP,但想要​​一个也适用于 Windows 7 的解决方案。

4

3 回答 3

2

在你的情况下,我会采取懒人的方式,安装mingw,然后使用

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

查找 directoryA 中与 directoryB 中的文件具有相同 MD5 签名的每个文件,然后将其删除。

或者,如果您更喜欢不那么懒惰但不需要 mingw 的解决方案,请安装LuaLua POSIX 库(我认为可以在 Windows 上安装)。你可以用谷歌搜索 MD5 库并在 Lua 中完成整个操作,它是可移植的。与 mingw 解决方案不同,它很容易部署到任何人的 Windows 机器上;你可以制作一个独立的二进制文件。

于 2010-07-14T14:44:42.597 回答
1

我对 Windows 进行了广泛的讨论,但您可能会在Windows PowerShell中找到您正在寻找的强大脚本功能(另请参阅Microsoft 的文档)。

PowerShell 对文件系统和其他地方的实体采用面向对象的方法。编写一个脚本来做你需要的事情应该很容易,但你当然需要先学习 PowerShell。


编辑:微软正在为 Windows XP 和其他一些提供 PowerShell 的下载,但我没有看到 Windows 7 的下载。啊......维基百科说它已经集成在 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 回答