Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как вывести одинаковые по содержанию файлы из заданных директорий?

Ответить
Настройки темы
CMD/BAT - Как вывести одинаковые по содержанию файлы из заданных директорий?

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем привет) Собственно сабж - как вывести одинаковые по содержанию файлы из заданных директорий (возможны разные имена)?
Пока что знаю как сделать ввод нескольких директорий lдля поиска файлов:
Код: Выделить весь код
Rem Задаём количество директорий для поиска (с проверкой на 0)
:NUM
Set /P $NUM="Input number of folders: "
Set $IDX=1& Set /A $NUM+=0
If %$NUM% EQU 0 GoTo NUM

Rem Задаём директории для поиска (с проверкой на существование этих директорий)
:DIR
Set /P $_%$IDX%="Input path to folder %$IDX% for search: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
If %$IDX% LEQ %$NUM% GoTo DIR
Помогите пожалуйста) Заранее благодарен

Отправлено: 21:20, 18-05-2010

 

Аватара для zonderz

Ветеран


Сообщения: 727
Благодарности: 150

Профиль | Отправить PM | Цитировать


Цитата Lil Crazy:
одинаковые по содержанию файлы »
сравнивать контрольную сумму файлов или хеш
например с помощью md5

-------
MCP, MCSA, MCSE, разработчик программы CMDTools
http://forum.oszone.net/thread-170783.html


Отправлено: 23:58, 18-05-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата zonderz:
сравнивать контрольную сумму файлов или хеш
например с помощью md5 »
А как это написать в коде скрипта?

Отправлено: 14:57, 19-05-2010 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Lil Crazy:
А как это написать в коде скрипта? »
вариант с использованием md5deep:
Код: Выделить весь код
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

:NUM
::--------------------------------
:: Количество каталогов для поиска
::--------------------------------
Set /P $NUM="Input number of folders: "
Set $IDX=1& Set /A $NUM+=0
::--------------------------------
If %$NUM% EQU 0 GoTo NUM

:DIR
::---------------------------
:: Имена каталогов для поиска
::---------------------------
Set /P $_%$IDX%="Input path to folder %$IDX% for search: "
Call Set $T=%%$_%$IDX%%%
If Exist %$T% Set /A $IDX+=1
::---------------------------
If %$IDX% LEQ %$NUM% GoTo DIR

Echo Удаление временных файлов...
2>Nul DEL /F/Q *.tmp *.~*
Echo Формирование списка файлов...
For /F "Tokens=1* Delims==" %%a In ('Set $_') Do md5deep -r "%%~b">>"%~n0.~t1"
Echo Сортировка списка...
Sort "%~n0.~t1" /O "%~n0.~t2"
Echo Группировка/обработка списков дублей...
Call :GRP_EX "%~n0.~t2" EX "%~n0.~t3"& Exit

:EX
::===================
:: Обработка списка
:: идентичных файлов
::-------------------
:: %1 - список файлов
::-------------------
 Echo -----
 Type "%~1"
::===================
GoTo :EOF

:GRP_EX
::====================================================
:: Обработка списка в формате: ключ значение 
:: группировка строк, вывод значений во временный файл
:: с последующей передачей на обработку в процедуру.
::----------------------------------------------------
:: %1 - входной файл списка
:: %2 - имя процедуры обработки
:: %3 - имя для рабочего файла
::----------------------------------------------------
 SetLocal& Set $F=& Set $A=& Echo _>>"%~1"
 For /F "UseBackQ Tokens=1*" %%a In ("%~1") Do (
 If Not "!$A!"=="%%~a" (If Not Defined $F (Echo %%~b>"%~3") Else (
 Set $F=& Call :%~2 "%~3"& Echo %%~b>"%~3")) Else Set $F=F& Echo %%~b>>"%~3"
 Set $A=%%~a)
::====================================================
EndLocal& GoTo :EOF
- имена файлов/каталогов не должны содержать символов "!"
- файлы с русскими буквами в именах обрабатываются, но отображаются знаком "?"

З.Ы. каждое ограничение можно снять ценой усложнения/замедления работы скрипта
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:16, 21-05-2010 | #4


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


кстати, можно и штатными средствами через FC - не самый оптимальный вариант в плане скорости, особенно при сравнении больших файлов... поэтому, только из академического интереса (блок ввода путей опустил):
Код: Выделить весь код
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set $_1=C:\TEST1
Set $_2=C:\TEST2

Echo.&<Nul Set /P $TMP="Удаление временных файлов..."
Echo Ok& 2>Nul DEL /F/Q *.tmp *.~*
<Nul Set /P $TMP="Формирование списка файлов..."
For /F "Tokens=1* Delims==" %%a In ('Set $_') Do DIR /B/A-D/S "%%~b">>"%~n0.tmp"2>Nul
Echo Ok&<Nul Set /P $TMP="Добавление размера файлов..."
For /F "UseBackQ Delims=" %%i In ("%~n0.tmp") Do Echo %%~zi,"%%~i">>"%~n0.~t1"
Echo Ok&<Nul Set /P $TMP="Сортировка списка..."
Sort "%~n0.~t1" /O "%~n0.~tmp"&& DEL "%~n0.~t1"&& REN "%~n0.~tmp" "%~n0.~t1"
Echo Ok& Echo.

Call :GRP_EX "%~n0.~t1" EX_Z "%~n0.~t2"& Exit

:EX_T
::===================
:: Обработка списка
:: идентичных файлов
::-------------------
:: %1 - список файлов
::-------------------
 Echo -----
 Type "%~1"
::===================
GoTo :EOF

:EX_Z
::=========================================
:: Попарное сравнение файлов одного размера
::-----------------------------------------
:: %1 - список файлов
::-----------------------------------------
 SetLocal
 ::сохранение пар размер/файл в переменные окружения
 For /F "Tokens=1* Delims=[]" %%a In ('^<"%~1" Find /N /V ""') Do Set $FZ_%%a=%%~b& Set $NZ=%%a
 ::попарное сравнение и формирование сигнатуры сравнения
 For /L %%i In (1,1,%$NZ%) Do For /L %%j In (1,1,%$NZ%) Do (
 FC /B "!$FZ_%%i!" "!$FZ_%%j!">nul& Set $MZ_%%i=!$MZ_%%i!!ERRORLEVEL!)
 ::сохранение/сортировка списка в формате: сигнатура,"имя файла"
 For /F "Tokens=1,2* Delims==_" %%a In ('Set $MZ_') Do Echo %%c,"!$FZ_%%b!">>"%~n0.~t3"
 Sort "%~n0.~t3" /O "%~n0.~tmp"&& DEL "%~n0.~t3"&& REN "%~n0.~tmp" "%~n0.~t3"
 ::группировка по значению сигнатуры и вызов EX_T
 Call :GRP_EX "%~n0.~t3" EX_T "%~n0.~t4"& DEL /F/Q "%~n0.~t3"
::=========================================
EndLocal& GoTo :EOF

:GRP_EX
::====================================================
:: Обработка отсортированного списка: ключ,значение 
:: группировка строк, вывод значений во временный файл
:: с последующей передачей на обработку в процедуру.
::----------------------------------------------------
:: %1 - входной файл списка
:: %2 - имя процедуры обработки
:: %3 - имя для рабочего файла
::----------------------------------------------------
 SetLocal& Set $F=& Set $A=& Echo _>>"%~1"
 For /F "UseBackQ Tokens=1* Delims=," %%a In ("%~1") Do (
 If Not "!$A!"=="%%~a" (If Not Defined $F (Echo %%~b>"%~3") Else (
 Set $F=& Call :%~2 "%~3"& Echo %%~b>"%~3")) Else Set $F=F& Echo.%%~b>>"%~3"
 Set $A=%%~a)
::====================================================
EndLocal& GoTo :EOF
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:22, 21-05-2010 | #5


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


amel27, спасибо большое - использовал второй вариант.

Отправлено: 11:17, 23-05-2010 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как вывести одинаковые по содержанию файлы из заданных директорий?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Перенос из заданных директорий в новую файлы, содержащие заданное слово Lil Crazy Скриптовые языки администрирования Windows 11 14-05-2010 20:46
[решено] Как убрать одинаковые ярлыки из контекстного меню? Moandor Microsoft Windows 95/98/Me (архив) 2 10-12-2009 11:58
[решено] Вывести все файлы и папки morgan1991 AutoIt 6 18-03-2009 22:35
Как отсортировать одинаковые файлы? Evita Хочу все знать 3 25-08-2005 18:37
Искать одинаковые файлы Guest Хочу все знать 4 15-04-2003 13:10




 
Переход