给定两个目录c:\ foo和c:\ bar我想删除c:\ bar中与c:\ foo中存在的文件相同的文件。我可以使用fc命令将c:\ bar中的每个文件与c:\ foo中的同名文件进行比较,并手动删除重复项。有没有一种简单的方法可以使用CMD自动执行此操作?
答案 0 :(得分:4)
如果相同表示similar or alike in every way:每种方式,不仅仅是 date 和 size 因此强制二进制比较:
imgix.fluid()
上述脚本中的关键点:
@ECHO OFF >NUL
SETLOCAL enableextensions
pushd "D:\bat\FooBar"
for /F "delims=" %%G in ('dir /B /A:-D *.*') do (
call :proFC "%%~fG" "D:\bat\FooFoo\%%~nxG"
)
popd
ENDLOCAL
goto :eof
:raiseerror
exit /B %1
:proFC
call :raiseerror 321
fc /B "%~1" "%~2" >NUL 2>&1
if %errorlevel% EQU 0 (
echo del "%~1"
) else (
echo %errorlevel% "%~2"
)
goto :eof
切换当前工作目录pushd ...
循环处理 Bar 文件夹的静态文件列表
for /F ...
call :proFC ...
切换当前工作目录popd
结束脚本 goto :eof
子例程通过:raiseerror
exit /B %1
富有成效的子程序
:proFC
重要为For an invalid switch (with two passed files) an error message is printed but the errorlevel
is not changed call :raiseerror 321
输出错误消息redirected至fc /B "%~1" "%~2" >NUL 2>&1
,因为错误级别很重要; NUL
if %errorlevel% EQU 0 (
文件删除仅_echo_ed用于调试目的echo del "%~1"
) else (
用于调试目的(见下文)。 echo %errorlevel% "%~2"
从子程序返回 goto :eof
将如下设置FC
(但请参阅ErrorLevel
点处的注释):
call :raiseerror 321
答案 1 :(得分:2)
@echo off
cd c:\bar
for %%a in (*.*) do for %%b in ("c:\foo\%%a") do (
if exist "%%b" (
if "%%~Ta %%~Za" equ "%%~Tb %%~Zb" (
del "%%a"
) else (
fc "%%a" "%%b" > NUL
if not errorlevel 1 del "%%a"
)
)
)
如果两个文件的修改日期不同但相同,请删除比较中的%%~T..
部分。