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

时间:2010-07-14 13:36:06

标签: windows scripting batch-file windows-scripting

我将 directoryA 作为 directoryB 的副本进行填充,并更改或添加了一些文件。我想自动删除 directoryA 中包含 directoryB 中的冗余副本的所有文件的过程。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

或者,如果您更喜欢不太懒惰的解决方案但不需要mingw,请安装LuaLua POSIX library(我认为可以安装在Windows上)。您可以谷歌搜索MD5库并在Lua中执行整个操作,它将是可移植的。与mingw解决方案不同,它可以轻松部署到任何人的Windows盒子上;你可以制作一个独立的二进制文件。

答案 1 :(得分:1)

我围绕Windows做了大量工作,但您可能会在Windows PowerShell中找到您正在寻找的强大脚本功能(另请参阅Microsoft's documentation)。

PowerShell采用面向对象的方法来处理文件系统和其他地方的实体。你可以很容易地编写一个脚本来完成你需要的工作,但是当然你需要首先学习PowerShell。


编辑:微软正在为Windows XP和其他一些产品提供PowerShell下载,但我没有看到Windows 7的下载。啊...维基百科说它已经集成在Windows 7中了。所以这应该满足你的要求,它已经安装了最新版本的Windows。

答案 2 :(得分: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!".
    )
)