2014-09-27 2 views
3

мне нужна пакетный файл (Windows CMD является интерпретатор, .bat-), чтобы сделать этот тип задачи:для Windows пакетного файла для поиска дубликатов в дереве

1) Поиском через папку и ее подпапки

2) Поиск файлов с тем же именем и расширением (ака дублей)

3) Проверьте, если они имеют одинаковый размер

4) если же имя + тот же самый размер, повторить все файлы, кроме первого (практически мне нужно удалить все, кроме одного экземпляра)

Спасибо для любого типа помощи

Это только первоначальный сценарий, только для проверки файлов в папке и ее подпапках, а также их размер:

@Echo off 
Setlocal EnableDelayedExpansion 

Set Dir=C:\NewFolder 

For /r "%Dir%" %%i in (*) do (
Set FileName=%%~nxi 
Set FullPath=%%i 
Set Size=%%~zi 
Echo "!FullPath!" - SIZE: !Size! 
) 
Echo. 
Pause 
+0

Можете ли вы добавить код, который вы пробовали? Кроме того, некоторая информация о (например) вашей операционной системе или командном интерпретаторе была бы полезна для потенциальных ответчиков. – chrisb2244

+0

Ну, у кода, который у меня есть, есть проблема после цикла, я не думаю, что оперативная система имеет какое-то значение для a. bat/CMD, но это Windows XP – Thummer

+0

Попробуйте посмотреть: http://superuser.com/questions/366487/make-a-batch-file-find-duplicate-file-names-with-different-extensions-and-actio Я не пробовал писать сценарии/пакетные файлы для Windows, но, похоже, хотя бы какой-то успех был задан вопросом в этом случае. В частности, взгляните на 'forfiles', который (согласно Википедии) доступен из Win Vista и далее: http://en.wikipedia.org/wiki/Forfiles – chrisb2244

ответ

6

Этот сценарий делает то, что вы просите. Просто установите переменную ROOT в верхней части, чтобы указать на корень вашего дерева.

@echo off 
setlocal disableDelayedExpansion 
set root="c:\test" 
set "prevTest=none" 
set "prevFile=none" 
for /f "tokens=1-3 delims=:" %%A in (
    '"(for /r "%root%" %%F in (*) do @echo %%~znxF:%%~fF:)|sort"' 
) do (
    set "currTest=%%A" 
    set "currFile=%%B:%%C" 
    setlocal enableDelayedExpansion 
    if !currTest! equ !prevTest! echo "!currFile!" 
    endlocal 
    set "prevTest=%%A" 
) 

Но вы можете сделать тест более точным, используя FC для сравнения содержимого файлов. Кроме того, вы можете включить команду DEL непосредственно в скрипт. В приведенном ниже скрипте выведены команды, которые будут удалять дубликаты файлов. Удалите ECHO перед командой DEL, когда вы готовы фактически удалить файлы.

@echo off 
setlocal disableDelayedExpansion 
set root="c:\test" 

set "prevTest=none" 
set "prevFile=none" 
for /f "tokens=1-3 delims=:" %%A in (
    '"(for /r "%root%" %%F in (*) do @echo %%~znxF:%%~fF:)|sort"' 
) do (
    set "currTest=%%A" 
    set "currFile=%%B:%%C" 
    setlocal enableDelayedExpansion 
    set "match=" 
    if !currTest! equ !prevTest! fc /b "!prevFile!" "!currFile!" >nul && set match=1 
    if defined match (
    echo del "!currFile!" 
    endlocal 
) else (
    endlocal 
    set "prevTest=%%A" 
    set "prevFile=%%B:%%C" 
) 
) 

Оба набор кода может показаться слишком сложным, но это только потому, что я структурировал код, чтобы быть надежными и избежать проблем, которые могут досаждают простые решения. Например, ! в именах файлов может вызвать проблемы с переменными FOR, если включено замедленное расширение, а = в имени файла вызывает проблему с решением npocmoka.

1
@echo off 

setlocal 

for /f "tokens=1 delims==" %%# in ('set _') do (
    set "%%#=" 
) 

for /r %%a in (*.*) do (
    if not defined _%%~nxa%%~za (
     set "_%%~nxa%%~za=%%~fa" 
    ) else (
     echo %%~fa 
    ) 
) 

endlocal 
+1

+1, Это не удастся, если имя файла содержит символ '='. Но в остальном это хороший и простой алгоритм. – dbenham

+0

Почему задержка расширения, когда вы его не используете? Это вызовет проблемы, если имя содержит '!'. Вашему алгоритму не требуется замедленное расширение. – dbenham

+0

@dbenham Я думаю, что 'if not defined' завершится без задержки. Не тестировал его без него, но у меня такая память. – npocmaka

Смежные вопросы