Windows 删除目录中的所有冗余文件

Windows 删除目录中的所有冗余文件,windows,scripting,batch-file,windows-scripting,Windows,Scripting,Batch File,Windows Scripting,我有directoryA,它作为directoryB的副本填充,并且一些文件被更改或添加。我想自动删除目录a中所有在目录b中有冗余副本的文件 两个目录都有几层子目录,因此解决方案可能必须是递归的 我的第一个想法是创建一个批处理脚本,但我对microsoft命令提示符还不熟悉,它似乎与bash脚本有很大不同,我对bash脚本的使用经验有限 我使用的是Windows XP,但希望有一个同样适用于Windows 7的解决方案。我对Windows不太熟悉,但您可能会在中找到所需的强大脚本功能(另请参阅)

我有directoryA,它作为directoryB的副本填充,并且一些文件被更改或添加。我想自动删除目录a中所有在目录b中有冗余副本的文件

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

我的第一个想法是创建一个批处理脚本,但我对microsoft命令提示符还不熟悉,它似乎与bash脚本有很大不同,我对bash脚本的使用经验有限


我使用的是Windows XP,但希望有一个同样适用于Windows 7的解决方案。

我对Windows不太熟悉,但您可能会在中找到所需的强大脚本功能(另请参阅)

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



编辑:微软正在提供WindowsXP和其他一些版本的PowerShell下载,但我没有看到Windows7版本的。啊。。。维基百科说它已经集成到Windows7中了。因此,这应该可以满足您的需求,而且最新版本的Windows已经在使用中。

我对Windows有着广泛的了解,但您可能会在中找到所需的强大脚本功能(另请参阅)

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



编辑:微软正在提供WindowsXP和其他一些版本的PowerShell下载,但我没有看到Windows7版本的。啊。。。维基百科说它已经集成到Windows7中了。因此,这应该可以满足您的要求,而且最新版本的Windows已经在使用中。

在您的情况下,我会选择懒人的方式,安装mingw并使用它

find directoryA directoryB -type f -exec md5sum '{}' ';' |
my-bash-script
要查找directoryA中与directoryB中的文件具有相同MD5签名的每个文件,请将其删除


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

在你的情况下,我会让懒惰的人退出,安装mingw,然后使用

find directoryA directoryB -type f -exec md5sum '{}' ';' |
my-bash-script
要查找directoryA中与directoryB中的文件具有相同MD5签名的每个文件,请将其删除


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

如果您想要一个不需要安装第三方软件的解决方案,请使用下面的脚本。它只使用内置的命令行工具

脚本首先检查一些常见的错误情况。然后它递归地遍历cleanup目录中的所有文件。如果在备份目录中找到一个同名的文件,它将进行二进制比较,以确定该文件是否冗余

@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!".
    )
)

如果您想要一个不需要安装第三方软件的解决方案,请使用下面的脚本。它只使用内置的命令行工具

脚本首先检查一些常见的错误情况。然后它递归地遍历cleanup目录中的所有文件。如果在备份目录中找到一个同名的文件,它将进行二进制比较,以确定该文件是否冗余

@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!".
    )
)

对于没有使用这两种方法的经验的人来说,这几乎毫无帮助。顺便说一句,你也可以为此重新编译VBScript,它的优点是不必在旧版Windows系统上安装任何东西。多亏了我的回答,OP现在比以前有了更多的信息和选项。如果他成功地学习了bash,那么他在PowerShell方面也不会有任何问题;就命令shell而言,这是微软官方的“前瞻性”产品,因此我打赌这将是一项比VBScript更好的未来投资。在花了一些时间研究PowerShell命令之后,我认为用几行代码来完成这项任务是相当简单的。我实际上还没有实现任何东西,但它似乎很有希望。我也在考虑自动化其他各种流程。我不确定PowerShell的命令行有多丰富,但我知道bash有多强大。我想我最终可能会找到一个真正的类似unix的环境,然后用bash编写脚本。没有个人经验,但我听过可信的说法,PowerShell比bash强大得多。由于bash使您能够控制和访问/bin和/usr/bin中的所有程序,PowerShell为每个具有COM接口的DLL提供了完整的编程接口—这基本上是Windows/.NET的底层构建块。Unix shell脚本仅通过文本流stdin/stdout进行通信;PowerShell访问对象属性和方法。此外,PowerShell是一种现代而完整的编程语言,与bash相比,它具有更高的一致性和更少的特殊性。但在对PowerShell的热情推荐之后:如果您控制着环境(并将继续控制环境),并且您对bash和朋友有很好的工作知识,那么,移植类Unix解决方案可能是最容易的选择。每当我需要它时,一些挖掘就会发现我有一套相当完整的基于mingw的Unix实用程序,包括bash。这些程序在Windows下模拟Unix环境方面做得相当不错。推荐。