2011-01-06 6 views
1

처리해야하는 수천 개의 텍스트 파일이있는 디렉토리가 있습니다. 이 파일 중 일부는 동일하지만 다른 파일은 타임 스탬프가 몇 초/밀리 초씩 다릅니다. 동일한 파일의 삭제를 자동화하고 사본 하나만 유지하는 방법이 필요합니다.콘텐츠별로 동일한 파일을 제거하는 DOS 스크립트

내가 같은 생각 해요 :

while there are files in the directory still 
{ 
    get file     // e.g., file0001 

    while (file == file + 1) // e.g., file0001 == file0002 using 'fc' command 
    { 
     delete file + 1 
    } 

    move file to another directory 
} 

는 마이크로 소프트의 Windows Server 2003의 DOS에서도 가능한이 같은가요?

답변

7

물론입니다. 모든 것이 일괄 적으로 가능합니다. : D

이 배치는 실제로 파일을 삭제하지 않습니다. 그것은 단지 비교 결과를 에코합니다. 두 파일이 동일한 경우 파일 중 하나를 삭제할 수 있습니다.

CleanDuplicates.bat와 코드를 저장하고 보장하지 않고, AS IS 제공 CleanDuplicates {Folder}

으로 프로그램을 시작! 네가 내 서버를 노크하고 싶지 않아. 네 서버가 엉망이 됐어. ;-)

실제로 코드 자체가 반복적으로 호출됩니다. 이것은 어쩌면 다른 방법으로 할 수 있지만 어이, 그것은 작동합니다. 새로운 cmd에서는 다시 시작되기 때문에 정리가 쉬워지기 때문입니다. Windows Vista Business에서 스크립트를 테스트했지만 Server 2003에서도 작동합니다. 이봐, 도움 기능도있다. ;-) 각 파일을 반환하는 두 개의 루프가 포함되어 있으므로 실제 삭제를 구현할 때 이전 반복에서 삭제되기 때문에 일부 파일이 존재하지 않는다고보고 할 수 있습니다.

@echo off 
rem Check input. //, /// and //// are special parameters. No parameter -> help. 
if %1check==//check goto innerloop 
if %1check==///check goto compare 
if %1check==////check goto shell 
if %1check==/hcheck goto help 
if %1check==check goto help 

rem Start ourselves within a new cmd shell. This will automatically return to 
rem the original directory, and clear our helper environment vars. 
cmd /c %0 //// %1 
echo Exiting 
goto end 

:shell 
rem Save the current folder, jump to target folder and set some helper vars 
set FCOrgFolder=%CD% 
cd %2 
set FCStartPath=%0 
if not exist %FCStartPath% set FCStartPath=%FCOrgFolder%\%0 

rem Outer loop. Get each file and call ourselves with the first special parameter. 
for %%a in (*.*) do call %FCStartPath% // "%2" "%%a" 

goto end 

:innerloop 
rem Get each file again and call ourselves again with the second special parameter. 
for %%b in (*.*) do call %FCStartPath% /// %2 %3 "%%b" 
goto end 

:compare 
rem Actual compare and some verbose. 
if %3==%4 goto end 
echo Comparing 
echo * %3 
echo * %4 

fc %3 %4 >nul 

rem Get results 
if errorlevel 2 goto notexists 
if errorlevel 1 goto different 

echo Files are identical 
goto end 

:different 
echo Files differ 
goto end 

:notexists 
echo File does not exist 
goto end 

:help 

echo Compares files within a directory. 
echo Usage: %0 {directory} 
goto end 

:end 
+0

대답이 잘못 되었습니까? 그렇지 않은 경우 무엇이 잘못 되었나요? 그것을 향상시킬 수 있습니까? – GolezTrol

+0

트릭을 수행합니다! 지금은 중복 된 동일한 파일을 삭제하도록 수정하고 있습니다. 스크립트가 두 개의 다른 파일을 찾으면 다음 파일로 넘어갈 수 있도록 수정할 수 있습니까? 그리고 파일 목록의 시작 부분으로 돌아가는 대신 다음 순차 파일과 비교해보십시오. 지금은 모든 파일 (O^(n^2))과 비교하고 있습니다. 그러나 두 파일이 다르면 이후 파일도 동일하지 않습니다. – tridium

+0

예, 좋은 해결책은 여기에서 찾을 수 있습니다 : http://stackoverflow.com/questions/1184408/exit-in-for-loop-windows-command-processor-cmd-exe – GolezTrol