DOS-скрипт для удаления идентичных файлов по содержимому - PullRequest
1 голос
/ 06 января 2011

У меня есть каталог с несколькими тысячами текстовых файлов, которые мне нужно обработать.Некоторые из этих файлов идентичны, в то время как другие идентичны, за исключением того, что временная метка изменяется на несколько секунд / миллисекунд.Мне нужен какой-то способ автоматизировать удаление идентичных файлов и сохранить только одну копию.

Я думаю о чем-то вроде:

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
}

Такое возможно даже в Microsoft Windows ServerDOS 2003?

1 Ответ

7 голосов
/ 06 января 2011

Конечно, это так. Все возможно в партии. : D

Этот пакет фактически не удаляет файлы. Это просто повторяет результат сравнения. Вы можете удалить любой из файлов, если найдете два одинаковых.

Сохраните код как CleanDuplicates.bat и запустите программу с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...