我有directoryA作为directoryB的副本填充,并且一些文件被更改或添加。我想自动化从 directoryA 中删除所有在directoryB中具有冗余副本的文件的过程。
这两个目录都有多层子目录,因此解决方案可能必须是递归的。
我的第一个想法是创建一个批处理脚本,但我是 microsoft 命令提示符的新手,它似乎与 bash 脚本有很大不同,我在这方面的经验有限。
我使用的是 Windows XP,但想要一个也适用于 Windows 7 的解决方案。
我有directoryA作为directoryB的副本填充,并且一些文件被更改或添加。我想自动化从 directoryA 中删除所有在directoryB中具有冗余副本的文件的过程。
这两个目录都有多层子目录,因此解决方案可能必须是递归的。
我的第一个想法是创建一个批处理脚本,但我是 microsoft 命令提示符的新手,它似乎与 bash 脚本有很大不同,我在这方面的经验有限。
我使用的是 Windows XP,但想要一个也适用于 Windows 7 的解决方案。
在你的情况下,我会采取懒人的方式,安装mingw,然后使用
find directoryA directoryB -type f -exec md5sum '{}' ';' |
my-bash-script
查找 directoryA 中与 directoryB 中的文件具有相同 MD5 签名的每个文件,然后将其删除。
或者,如果您更喜欢不那么懒惰但不需要 mingw 的解决方案,请安装Lua和Lua POSIX 库(我认为可以在 Windows 上安装)。你可以用谷歌搜索 MD5 库并在 Lua 中完成整个操作,它是可移植的。与 mingw 解决方案不同,它很容易部署到任何人的 Windows 机器上;你可以制作一个独立的二进制文件。
我对 Windows 进行了广泛的讨论,但您可能会在Windows PowerShell中找到您正在寻找的强大脚本功能(另请参阅Microsoft 的文档)。
PowerShell 对文件系统和其他地方的实体采用面向对象的方法。编写一个脚本来做你需要的事情应该很容易,但你当然需要先学习 PowerShell。
编辑:微软正在为 Windows XP 和其他一些提供 PowerShell 的下载,但我没有看到 Windows 7 的下载。啊......维基百科说它已经集成在 Windows 7 中。所以这应该满足你的要求,它是已搭载最新版本的 Windows。
如果您想要一个不需要安装第三方软件的解决方案,请使用以下脚本。它只使用内置的命令行工具。
该脚本首先检查一些常见的错误情况。然后它递归地遍历清理目录中的所有文件。如果它在备份目录中找到同名的文件,它会进行二进制比较以确定文件是否冗余。
@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!".
)
)