Using only standard commands, I have scripted CompFldrS.bat to compare the file names of two folders and their sub-folders.
The syntax for using CompFldrS.bat is:
\[call\] CompFldS Folder1 Folder2
Where Folder1 and Folder2 are the respective folder paths. They must use drive letters.
Example:
If C:\Folder1 contains the following file names:"C:\Folder1\I am in Folder1 but Not in Folder2.doc" "C:\Folder1\I am in both Folders.doc" "C:\Folder1\Folder1Sub\File1.txt" and D:\Folder2 contains the following file names: "D:\Folder2\I am in both folders.doc" "D:\Folder2\I am in Folder2 but Not in Folder1.doc" "D:\Folder2\Folder1Sub\File1.txt" "D:\Folder2\Folder2Sub\File2.txt" then compfldrs c:\folder1 d:\folder2 would produce: "C:\Folder1\I am in Folder1 but Not in Folder2.doc" "D:\Folder2\I am in Folder2 but Not in Folder1.doc" "D:\Folder2\Folder2Sub\File2.txt"NOTE: CompFldrS.bat uses VarLen.bat.
NOTE: Any differences in file name case is not significant.
CompFldrS.bat contains:
@echo off setlocal if exist "%TEMP%\CompFldr*.tm*" del /q "%TEMP%\CompFldr*.tm*" if \{%2\}==\{\} goto Syntax if not exist %1 goto Syntax if not exist %2 goto Syntax for /f "tokens=*" %%s in ("%1") do ( set Src=%%~fs set SrcAttr=%%~as set SrcDrv=%%~ds ) set Src="%Src:"=%" set Src=%Src:\"="% for /f "tokens=*" %%d in ("%2") do ( set Dst=%%~fd set DstAttr=%%~ad set DstDrv=%%~dd ) set Dst="%Dst:"=%" set Dst=%Dst:\"="% :: Verify Source and Destination are folders if /i "%SrcAttr:~0,1%%DstAttr:~0,1%" NEQ "dd" goto error if /i %Src% EQU %Dst% goto error If "%SrcDrv:~1,1%" NEQ ":" goto notlcl If "%DstDrv:~1,1%" NEQ ":" goto notlcl set prev=N call :silent>nul 2>&1 for /f "Tokens=*" %%a in ('type "%TEMP%\CompFldr_Sort.tm3"') do ( set line=%%a call :Report ) :finish if exist "%TEMP%\CompFldr*.tm*" del /q "%TEMP%\CompFldr*.tm*" endlocal exit /b 0 :Report set line=%line:"=% set line=%line:/=\% if "%line:~0,1%" EQU "." set pline=%line:~3%&call VarLen pline Len&goto :EOF set Drv=%line:~0,2% call set tline=%%line:~3,%len%%% if "%tline%" NEQ "%pline%" goto :EOF @echo "%Drv%%pline%" goto :EOF :notlcl @echo %Src% and %Dst% must use drive letters. goto Syntax :error @echo %Src% and %Dst% must be (different) folders. :Syntax @echo Syntax: CompFldrS Folder1 Folder2 endlocal exit /b 1 :silent dir %Src% /b /a-d /s >>"%TEMP%\CompFldr_Src.tm0" dir %Dst% /b /a-d /s >>"%TEMP%\CompFldr_Dst.tm0" for /f "Tokens=*" %%s in ('type "%TEMP%\CompFldr_Src.tm0"') do ( call :SrcD "%%s" ) for /f "Tokens=*" %%d in ('type "%TEMP%\CompFldr_Dst.tm0"') do ( call :DstD "%%d" ) findstr /i /v /l /g:"%TEMP%\CompFldr_Dst.tm1" "%TEMP%\CompFldr_Src.tm1">"%TEMP%\CompFldr_Src.tm2" findstr /i /v /l /g:"%TEMP%\CompFldr_Src.tm1" "%TEMP%\CompFldr_Dst.tm1">"%TEMP%\CompFldr_Dst.tm2" copy "%TEMP%\CompFldr_Src.tm2"+"%TEMP%\CompFldr_Dst.tm2"+"%TEMP%\CompFldr_Sort.tm1" "%TEMP%\CompFldr_Sort.tm2" sort /+5 "%TEMP%\CompFldr_Sort.tm2" /O "%TEMP%\CompFldr_Sort.tm3" goto :EOF :SrcD set work=%1 call set work=%%work:%SrcDrv%=%% set work=%work:"=% set work=%work:\=/% @echo "...%work%">>"%TEMP%\CompFldr_Src.tm1" @echo %SrcDrv% "%work%" 1 >>"%TEMP%\CompFldr_Sort.tm1" goto :EOF :DstD set work=%1 call set work=%%work:%DstDrv%=%% set work=%work:"=% set work=%work:\=/% @echo "...%work%">>"%TEMP%\CompFldr_Dst.tm1" @echo %DstDrv% "%work%" 2 >>"%TEMP%\CompFldr_Sort.tm1"
0 comments
Hide comments