@echo off
setlocal enableextensions enabledelayedexpansion
rem 作者:rubble@126.com
rem 17:55 2009-4-14 版本:0.4
set dira=%~1
set dirb=%~2
if "%1" == "" (
echo 使用說明:請在命令行參數上指明兩個目錄,或在這里按提示輸入。
echo 命令行參數格式:批處理名 ^<目錄1^> ^<目錄2^>
echo.
set /p dira=請輸入第一個目錄的名字(可拖放并輸入回車):
)
echo.
if "%2" == "" (
echo 使用說明:請在命令行參數上指明兩個目錄,或在這里按提示輸入。
echo 命令行參數格式:批處理名 ^<目錄1^> ^<目錄2^>
echo.
set /p dirb=請輸入第二個目錄的名字(可拖放并輸入回車):
)
if "%dira%" == "" exit /b
if "%dirb%" == "" exit /b
for /F "delims=. tokens=1" %%A in ("%TIME%") do set startTime=%%A
for /F "delims=: tokens=1,2,3" %%A in ("%startTime%") do (
set startH=%%A
set startM=%%B
set startS=%%C
)
set TEMPDIR=TEMPMD5/
rd /Q /S %TEMPDIR% 1>NUL 2>NUL
md %TEMPDIR%
set mdfive=md5v4.txt
rem 已處理的文件數
set count=0
rem 文件夾 %dira% 和 %dirb% 里的文件總數
set total_count=0
rem 已處理的臨時文件數
set tmpf_count=0
rem 臨時文件總數,已知有 5 個了。其余的是 md5 值的個數
set tmpf_total_count=5
echo 第 1/2步,正在計算,請稍候……
echo 正在比較 %dira% 和 %dirb% 中的文件的 md5 值 > %mdfive%
set list_fn_md=%TEMPDIR%list_fn_md
set list_fn_nmd=%TEMPDIR%list_fn_nmd
set list_fn_oa=%TEMPDIR%list_fn_oa
set list_fn_ob=%TEMPDIR%list_fn_ob
set list_all_md=%TEMPDIR%list_all_md
call :COUNTFILES %dira%
call :COUNTFILES %dirb%
for /f "delims=" %%a in ('dir /b /a:-d "%dira%/*"') do (
set fn=%%~nxa
for /f "tokens=1 delims= " %%A in ('md5sum "%dira%/%%a"') do set mda=%%A
set /a count=!count!+1
call :PROGRESS !count! !total_count!
if "!mda:~0,1!" == "/" set mda=!mda:~1,1024!
rem 以 !mda! 為文件名,記錄 md5 為 !mda! 的文件
call :ADDMDFN "%TEMPDIR%!mda!" "%dira%/!fn!"
rem 把 md5 值記錄到文件里,保證不重復
call :ADDMDLIST !mda!
if exist "%dirb%/!fn!" (
for /f "tokens=1 delims= " %%A in ('md5sum "%dirb%/!fn!"') do set mdb=%%A
set /a count=!count!+1
call :ADDMDFN "%TEMPDIR%!mdb!" "%dirb%/!fn!"
call :PROGRESS !count! !total_count!
if "!mdb:~0,1!" == "/" set mdb=!mdb:~1,1024!
if "!mda!" == "!mdb!" (
rem 記錄文件名相同并且 md5 相同的文件
echo !mda! !mdb! !fn! >> "!list_fn_md!"
) else (
rem 記錄文件名相同但 md5 不相同的文件
echo !mda! !mdb! !fn! >> "!list_fn_nmd!"
call :ADDMDLIST !mdb!
)
) else (
rem 記錄只在 %dira% 中出現的文件
echo !mda! !fn! >> "!list_fn_oa!"
)
)
for /f "delims=" %%a in ('dir /b /a:-d "%dirb%/*"') do (
set fn=%%~nxa
if not exist "%dira%/!fn!" (
for /f "tokens=1 delims= " %%A in ('md5sum "%dirb%/%%a"') do set mdb=%%A
if "!mdb:~0,1!" == "/" set mdb=!mdb:~1,1024!
rem 記錄只在 %dirb% 中出現的文件
echo !mdb! !fn! >> "!list_fn_ob!"
rem 把 md5 值記錄到文件里,保證不重復
call :ADDMDLIST !mdb!
call :ADDMDFN "%TEMPDIR%!mdb!" "%dirb%/!fn!"
set /a count=!count!+1
call :PROGRESS !count! !total_count!
)
)
echo 第 2/2步,正在統計,請稍候……
echo 統計:>>%mdfive%
echo 左:%dira% >> %mdfive%
echo 右:%dirb% >> %mdfive%
if not exist "%list_fn_md%" set /a tmpf_total_count-=1
if not exist "%list_fn_nmd%" set /a tmpf_total_count-=1
if not exist "%list_fn_oa%" set /a tmpf_total_count-=1
if not exist "%list_fn_ob%" set /a tmpf_total_count-=1
if not exist "%list_all_md%" set /a tmpf_total_count-=1
echo 兩個目錄中都存在且 md5 相同的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_md%"
echo ===============================================================================================>> %mdfive%
echo 左:%dira% >> %mdfive%
echo 右:%dirb% >> %mdfive%
echo 兩個目錄中都存在但 md5 不相同的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_nmd%"
echo ===============================================================================================>> %mdfive%
echo 只在目錄 %dira% 中存在的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_oa%"
echo ===============================================================================================>> %mdfive%
echo 只在目錄 %dirb% 中存在的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_ob%"
echo ===============================================================================================>> %mdfive%
echo 以 md5 匯總的文件列表:>> %mdfive%
call :OUTPUTLIST_MD "%list_all_md%"
goto ALLDONE
rem 統計文件夾里的文件數目,放到全局變量 total_count 里
:COUNTFILES
if %1=="" goto :EOF
for /f %%a in ('dir /b /a:-d "%~1/*"') do (
set /a total_count=!total_count!+1
)
goto :EOF
rem 參數 %1 必須加雙引號
:OUTPUTLIST
if %1 == "" goto :EOF
if not exist %1 goto :EOF
set tcnt=0
for /f "tokens=1* delims= " %%a in (%~1) do (
echo %%a %%b >> %mdfive%
set /a tcnt+=1
)
echo !tcnt! >> %mdfive%
set /a tmpf_count+=1
call :PROGRESS !tmpf_count! !tmpf_total_count!
goto :EOF
rem 參數 %1 必須加雙引號
:OUTPUTLIST_MD
if %1 == "" goto :EOF
if not exist %1 goto :EOF
set /a tmpf_count+=1
call :PROGRESS !tmpf_count! !tmpf_total_count!
set md_count=0
for /f "tokens=1* delims= " %%a in (%~1) do (
echo %%a >> %mdfive%
set tcnt=0
for /f "tokens=1* delims= " %%A in (!TEMPDIR!%%a) do (
echo %%A %%B >> %mdfive%
set /a tcnt+=1
)
set /a tmpf_count+=1
call :PROGRESS !tmpf_count! !tmpf_total_count!
echo !tcnt! >> %mdfive%
set /a md_count+=1
echo. >> %mdfive%
)
echo %md_count% >> %mdfive%
goto :EOF
rem 函數:把 md5 值保存到一個名為 !list_all_md! 的文件里,
rem 并保證不保存重復的 md5 值
:ADDMDLIST
if %1 == "" goto :EOF
if exist "!list_all_md!" (
rem 這里的 delims 要么刪除,要么做成像下面這行的樣子,在等號后面加個空格
rem for /f "tokens=1 delims= " %%a in (!list_all_md!) do (
for /f "tokens=1 " %%a in (!list_all_md!) do (
if "%%a" == "%1" goto :EOF
)
)
echo %1 >> "!list_all_md!"
rem 記錄臨時文件總數
set /a tmpf_total_count+=1
goto :EOF
rem 函數:以 %1 為文件名,保存 %2
rem %1:在這個應用里是 md5 值
rem %2:md5 值為 %1 的文件
:ADDMDFN
if %1 == "" goto :EOF
if %2 == "" goto :EOF
echo %2 >> %1
goto :EOF
:PROGRESS
set tips=
set backspace=
set /a percent=%1*100/%2
set /a char=%1%%7
set /a bnum=%percent%/10
set /a snum=10-%bnum%
for /L %%a in (1, 1, %bnum%) do set /p=
主站蜘蛛池模板:
台江县|
城市|
民勤县|
海安县|
六枝特区|
阳信县|
临桂县|
邯郸市|
行唐县|
洛阳市|
河北区|
淮安市|
谢通门县|
托里县|
青神县|
天全县|
绩溪县|
福州市|
九龙城区|
紫金县|
繁昌县|
乐山市|
酒泉市|
邢台县|
拜城县|
卢龙县|
元谋县|
天峨县|
宜宾县|
峡江县|
长兴县|
尚义县|
溆浦县|
阿荣旗|
疏勒县|
兴安盟|
邵武市|
闽侯县|
河西区|
阿勒泰市|
来安县|