我将 directoryA 作为 directoryB 的副本进行填充,并更改或添加了一些文件。我想自动删除 directoryA 中包含 directoryB 中的冗余副本的所有文件的过程。
两个目录都有多层子目录,因此解决方案可能必须是递归的。
我的第一个想法是创建一个批处理脚本,但我是微软命令提示符的新手,它似乎与bash脚本有很大的不同,我对它的使用经验有限。
我正在使用Windows XP,但想要一个也适用于Windows 7的解决方案。
答案 0 :(得分:2)
在你的情况下,我会采取懒人的方式,安装mingw,并使用
find directoryA directoryB -type f -exec md5sum '{}' ';' |
my-bash-script
查找directoryA中与directoryB中的文件具有相同MD5签名的每个文件,然后将其删除。
或者,如果您更喜欢不太懒惰的解决方案但不需要mingw,请安装Lua和Lua POSIX library(我认为可以安装在Windows上)。您可以谷歌搜索MD5库并在Lua中执行整个操作,它将是可移植的。与mingw解决方案不同,它可以轻松部署到任何人的Windows盒子上;你可以制作一个独立的二进制文件。
答案 1 :(得分:1)
我围绕Windows做了大量工作,但您可能会在Windows PowerShell中找到您正在寻找的强大脚本功能(另请参阅Microsoft's documentation)。
PowerShell采用面向对象的方法来处理文件系统和其他地方的实体。你可以很容易地编写一个脚本来完成你需要的工作,但是当然你需要首先学习PowerShell。
答案 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!".
)
)