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

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

两个目录都有几层子目录,所以解决scheme可能必须是recursion的。

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

我正在使用Windows XP,但希望能在Windows 7上运行的解决scheme。

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

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

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

在你的情况下,我会把懒人的出路,安装明戈,并使用

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

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

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

我在Windows上做了大量的工作,但是您可能会发现您在Windows PowerShell中寻找的强大的脚本功能(请参阅Microsoft的文档 )。

PowerShell采用面向对象的方法来访问文件系统中的实体和其他地方。 应该很容易地匆匆脚本来做你所需要的,但是当然你需要先学习PowerShell。


编辑:微软提供了Windows XP的PowerShell和其他一些下载,但我没有看到一个Windows 7啊…维基百科说,它已经集成在Windows 7中。所以,这应该涵盖您的要求,而且已经在最新版本的Windows上。