主頁 > 知識庫 > 批處理方式實(shí)現(xiàn)的目錄比較工具

批處理方式實(shí)現(xiàn)的目錄比較工具

熱門標(biāo)簽:沈陽電銷 無錫極信防封電銷卡價(jià)格 四川防封電銷卡套餐 谷歌地圖標(biāo)注錯位 用電話機(jī)器人取代人工 aa專業(yè)電話外呼系統(tǒng) 95專業(yè)外呼線路是怎么回事 外呼獲客系統(tǒng) 浙江語音外呼系統(tǒng)招商
更新日志:
v4:
1.增加了計(jì)算的進(jìn)度顯示;
2.找了新版的 md5sum.exe,沒有對動態(tài)庫的依賴。

工具一:md5comv4.bat 接受兩個(gè)目錄參數(shù),計(jì)算兩個(gè)目錄里每個(gè)文件的 md5 值,并給出報(bào)表文件 md5v4.txt,使用方法:
md5omv4.bat 目錄1> 目錄2>

根據(jù)這 md5comv4.bat 生成的報(bào)表文件 md5v4.txt,可以找到兩個(gè)目錄中
1:同名而且 md5 相同的文件;
2:同名但是 md5 不同的文件;
3:不同名但是 md5 相同的文件;
4:同一目錄中不同名但是 md5 相同的文件。

注意事項(xiàng):
1:md5comv4.bat 不接受路徑帶有空格的目錄名,但是可以接受帶有空格的文件名;
2:md5 的計(jì)算由 md5sum.exe 完成;
3:md5comv4.bat 運(yùn)行時(shí)會產(chǎn)生大量臨時(shí)文件,這些文件由工具自動維護(hù),不必手工清理。

這個(gè)工具都是命令行方式、文本界面的,對于習(xí)慣使用圖形界面的朋友來說,可能不方便,因此,不推薦習(xí)慣使用圖形界面的朋友使用。
復(fù)制代碼 代碼如下:

@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 使用說明:請?jiān)诿钚袇?shù)上指明兩個(gè)目錄,或在這里按提示輸入。
echo 命令行參數(shù)格式:批處理名 ^目錄1^> ^目錄2^>
echo.
set /p dira=請輸入第一個(gè)目錄的名字(可拖放并輸入回車):
)
echo.
if "%2" == "" (
echo 使用說明:請?jiān)诿钚袇?shù)上指明兩個(gè)目錄,或在這里按提示輸入。
echo 命令行參數(shù)格式:批處理名 ^目錄1^> ^目錄2^>
echo.
set /p dirb=請輸入第二個(gè)目錄的名字(可拖放并輸入回車):
)

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 已處理的文件數(shù)
set count=0
rem 文件夾 %dira% 和 %dirb% 里的文件總數(shù)
set total_count=0
rem 已處理的臨時(shí)文件數(shù)
set tmpf_count=0
rem 臨時(shí)文件總數(shù),已知有 5 個(gè)了。其余的是 md5 值的個(gè)數(shù)
set tmpf_total_count=5
echo 第 1/2步,正在計(jì)算,請稍候……
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%\!!"
rem 把 md5 值記錄到文件里,保證不重復(fù)
call :ADDMDLIST !mda!
if exist "%dirb%\!!" (
for /f "tokens=1 delims= " %%A in ('md5sum "%dirb%\!!"') do set mdb=%%A
set /a count=!count!+1
call :ADDMDFN "%TEMPDIR%!mdb!" "%dirb%\!!"
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% 中出現(xiàn)的文件
echo !mda! !fn! >> "!list_fn_oa!"
)
)
for /f "delims=" %%a in ('dir /b /a:-d "%dirb%\*"') do (
set fn=%%~nxa
if not exist "%dira%\!!" (
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% 中出現(xiàn)的文件
echo !mdb! !fn! >> "!list_fn_ob!"
rem 把 md5 值記錄到文件里,保證不重復(fù)
call :ADDMDLIST !mdb!
call :ADDMDFN "%TEMPDIR%!mdb!" "%dirb%\!!"
set /a count=!count!+1
call :PROGRESS !count! !total_count!
)
)
echo 第 2/2步,正在統(tǒng)計(jì),請稍候……
echo 統(tǒng)計(jì):>>%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 兩個(gè)目錄中都存在且 md5 相同的文件:>> %mdfive%
call :OUTPUTLIST "%list_fn_md%"
echo ===============================================================================================>> %mdfive%
echo 左:%dira% >> %mdfive%
echo 右:%dirb% >> %mdfive%
echo 兩個(gè)目錄中都存在但 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 統(tǒng)計(jì)文件夾里的文件數(shù)目,放到全局變量 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 參數(shù) %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 參數(shù) %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 函數(shù):把 md5 值保存到一個(gè)名為 !list_all_md! 的文件里,
rem 并保證不保存重復(fù)的 md5 值
:ADDMDLIST
if %1 == "" goto :EOF
if exist "!list_all_md!" (
rem 這里的 delims 要么刪除,要么做成像下面這行的樣子,在等號后面加個(gè)空格
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 記錄臨時(shí)文件總數(shù)
set /a tmpf_total_count+=1
goto :EOF

rem 函數(shù):以 %1 為文件名,保存 %2
rem %1:在這個(gè)應(yīng)用里是 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=▌NUL
for /L %%a in (1, 1, %snum%) do set /p= NUL
set /p=%1/%2 %percent%%% NUL
set /p=!tips:~%char%,1!NUL
if "%percent%" == "100" (
echo.
goto :EOF
)
set /p=%backspace%NUL
goto :EOF

rem :PROGRESS
rem set tips=
rem set backspace=
rem set /a char=%1%%7
rem set /p=!tips:~%char%,1!NUL
rem set /p=%backspace%NUL
rem goto :EOF

:ALLDONE

rd /Q /S %TEMPDIR% 1>NUL 2>NUL
for /F "delims=. tokens=1" %%A in ("%TIME%") do set endTime=%%A
for /F "delims=: tokens=1,2,3" %%A in ("%endTime%") do (
set endH=%%A
set endM=%%B
set endS=%%C
)
if "%endM:~0,1%" == "0" set endM=%endM:~1,1%
if "%endS:~0,1%"=="0" set endS=%endS:~1,1%
for /F "delims=: tokens=1,2,3" %%A in ("%startTime%") do (
set startH=%%A
set startM=%%B
set startS=%%C
)
if "%startM:~0,1%"=="0" set startM=%startM:~1,1%
if "%startS:~0,1%"=="0" set startS=%startS:~1,1%
set /A totalTime=%endH%*3600+%endM%*60+%endS%-(%startH%*3600+%startM%*60+%startS%)
echo 共用時(shí) %totalTime% 秒。
echo 起始時(shí)間:%startH%:%startM%:%startS%>>%mdfive%
echo 結(jié)束時(shí)間:%endH%:%endM%:%endS%>>%mdfive%
echo 共用時(shí) %totalTime% 秒。>>%mdfive%
start %mdfive%
echo 
endlocal
@echo on


文件打包下載

標(biāo)簽:煙臺 南平 廣安 青島 興安盟 連云港 迪慶 常德

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《批處理方式實(shí)現(xiàn)的目錄比較工具》,本文關(guān)鍵詞  批處理,方式,實(shí)現(xiàn),的,目錄,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《批處理方式實(shí)現(xiàn)的目錄比較工具》相關(guān)的同類信息!
  • 本頁收集關(guān)于批處理方式實(shí)現(xiàn)的目錄比較工具的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章