1 (изменено: Ed, 2014-06-25 22:15:33)

Тема: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Возможно ли это сделать с помощью AutoHotkey и, может быть, существует подобный скрипт?

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

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

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

2

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Возможно, конечно. Насчёт существующего скрипта не в курсе.

3

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Можно сделать так, присвоить переменной размеры всех файлов через какой-нибудь разделитель.
http://www.script-coding.com/AutoHotkey … lders.html
А потом проверить каждый размер файла на количество совпадений в этой переменной.
http://www.script-coding.com/AutoHotkey … place.html

4

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

А потом проверить каждый размер файла на количество совпадений в этой переменной.

Второй цикл для всех файлов, это многовато.


Res := [], Exist := [] 
Loop, C:\Users\sergey\Desktop\1\*.* 
    Exist[A_LoopFileSize] ? Res.Remove(A_LoopFileSize) 
        : Res[A_LoopFileSize] := A_LoopFileLongPath, Exist[A_LoopFileSize] := 1
For K, V in Res
    Files .= V "`n"
MsgBox % Files
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Malcev пишет:

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

Да и лично Я не понял, а как имена файлов сохраняются в таком варианте?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Во втором цикле проверяем если совпадение только один раз, то получаем имя файла.

7

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

то получаем имя файла.

А как мы его получаем, если в переменной только размеры?
Можешь весь код привести, ради интереса.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Loop, D:\test\*.*
   files .= A_LoopFileSize "|"
Loop, D:\test\*.*
{
   StringReplace, files, files, %A_LoopFileSize%, %A_LoopFileSize%, UseErrorLevel
   if ErrorLevel = 1
      fileList .= A_LoopFileLongPath "`n"
}
msgbox % fileList

9

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

А ну да, ещё раз парсить папку.

У тебя в коде ошибка. Подумай сам, какой прок от разделителя.
Например есть в папке файл 1 байт, другой 111 байт?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Точно ошибка. Просто  я совсем не понимаю массивы.

Loop, D:\test\*.*
   files .= "|" A_LoopFileSize "|"
Loop, D:\test\*.*
{
   StringReplace, files, files, |%A_LoopFileSize%|, |%A_LoopFileSize%|, UseErrorLevel
   if ErrorLevel = 1
      fileList .= A_LoopFileLongPath "`n"
}
msgbox % fileList

11 (изменено: Alectric, 2014-06-26 18:41:29)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Заинтересовала идея.
Вот мой вариант:


#SingleInstance,Force
SetBatchLines,-1


path=%a_desktop%\test
SkipLargeFiles=1
Fsize=5  ; Мегабайт

; Создаем 2-а массива и счетчик
loop,%path%\*.*,0,1
{
  if stop=1
    break
  tooltip,Сканирование файлов в папке %A_LoopFileDir%`nПросканированно %a_index% файла(ов).`nF1 - чтобы выйти.`nF2 - прервать и начать сравнение.
  counts++
  if (SkipLargeFiles=1 and A_LoopFileSizeMB>Fsize)
    continue
  name%a_index%:=A_LoopFileName
  size%a_index%:=A_LoopFileSize
}
msgbox,Найдено объектов: %counts%

; Определение совпадений
loop,% counts
{
  name:=name%a_index%
tooltip,Сравнение файлов:`n%name%`n%a_index%`nF1 - чтобы выйти.
  count++
  if name%count% contains %exept%
    continue
  loop,% counts
  {
    if (count=a_index)
      continue
    if name%count% contains %exept%
      continue
    if (size%a_index%=size%count%)
    {
      list.= name%count% "---------------" name%a_index% "`n"
;fileappend,% name%count% "---------------" name%a_index% "`n",%A_desktop%\files.txt
      exept.= name%a_index% ","
    }
  }
}

msgbox,%list%

f2::
stop=1
return

f1::
exitapp



Вместо определения размера можно подставить определение хэш-суммы файла.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

12 (изменено: Alectric, 2014-06-26 19:23:39)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Исправил свой вариант, убрал обратные совпадения.

Хотя есть вероятность что одинаковых файлов будет не 2 а больше...
Не соображу как сделать приличный список...



Внес еще несколько дополнений.




Вариант сравнения хеш суммы:

#SingleInstance,Force
SetBatchLines,-1

path=D:\
;path=%A_desktop%\test
SkipLargeFiles=1 ;пропускать файлы больше чем
Fsize=10 ; мегабайт

; Создаем 2-а массива и счетчик
loop,%path%\*.*,0,1
{
  if stop=1
    break
  if (dir!=A_LoopFileDir)
  {
    tooltip,Сканирование файлов в папке %A_LoopFileDir%`nПросканированно %a_index% файла(ов).`nF1 - чтобы выйти.`nF2 - прервать и начать сравнение.
    dir:=A_LoopFileDir
  }
  counts++
  if (SkipLargeFiles=1 and A_LoopFileSizeMB>Fsize)
    continue
  name%a_index%:=A_LoopFileFullPath
;  size%a_index%:=A_LoopFileSize
  MD%a_index%:=FileMD5(A_LoopFileFullPath)
}
;msgbox,Найдено объектов: %counts%

; Определение совпадений
loop,% counts
{
  name:=name%a_index%
  count++
  if name%count% contains %exept%
    continue
tooltip,Сравнение файлов:`n%name%`n%a_index%\%counts%`nF1 - чтобы выйти.
  loop,% counts
  {
    if (count=a_index)
      continue
    if name%count% contains %exept%
      continue
    if (MD%a_index%=MD%count%)
    {
;      list.= name%count% "---------------" name%a_index% "`n"
fileappend,% name%count% "`n" name%a_index% "`n`n",%A_desktop%\files.txt
      exept.= name%a_index% ","
    }
  }
}

;msgbox,%list%
msgbox,Готово!
exitapp

f2::
stop=1
return

f1::
exitapp


FileMD5(sFile="", cSz=4) {  ; by SKAN www.autohotkey.com/community/viewtopic.php?t=64211
 cSz := (cSz<0||cSz>8) ? 2**22 : 2**(18+cSz), VarSetCapacity( Buffer,cSz,0 )
 hFil := DllCall( "CreateFile", Str,sFile,UInt,0x80000000, Int,3,Int,0,Int,3,Int,0,Int,0 )
 IfLess,hFil,1, Return,hFil
 hMod := DllCall( "LoadLibrary", Str,"advapi32.dll" )
 DllCall( "GetFileSizeEx", UInt,hFil, UInt,&Buffer ),    fSz := NumGet( Buffer,0,"Int64" )
 VarSetCapacity( MD5_CTX,104,0 ),    DllCall( "advapi32\MD5Init", UInt,&MD5_CTX )
 Loop % ( fSz//cSz + !!Mod( fSz,cSz ) )
   DllCall( "ReadFile", UInt,hFil, UInt,&Buffer, UInt,cSz, UIntP,bytesRead, UInt,0 )
 , DllCall( "advapi32\MD5Update", UInt,&MD5_CTX, UInt,&Buffer, UInt,bytesRead )
 DllCall( "advapi32\MD5Final", UInt,&MD5_CTX )
 DllCall( "CloseHandle", UInt,hFil )
 Loop % StrLen( Hex:="123456789ABCDEF0" )
  N := NumGet( MD5_CTX,87+A_Index,"Char"), MD5 .= SubStr(Hex,N>>4,1) . SubStr(Hex,N&15,1)
Return MD5, DllCall( "FreeLibrary", UInt,hMod )
}
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

13 (изменено: Alectric, 2014-06-27 21:29:05)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Оптимизировал быстродействие для большого количества файлов (>1 000).
Путем "порчи" данных которые не нужны, и точно больше ни с чем не совпадут, вместо сохранения списка "exept", который сильно разрастается.

#SingleInstance,Force
SetBatchLines,-1

FileSelectFolder, path
;path=g:\
;path=%A_desktop%\test
SkipLargeFiles=1 ;пропускать файлы больше чем
Fsize=20 ; мегабайт
savefile=%A_desktop%\files.txt

file := FileOpen(savefile, "w")
if !IsObject(file)
{
  MsgBox Can't open "%FileName%" for writing.
  exitapp
}

; Создаем 2-а массива и счетчик
loop,%path%\*.*,0,1
{
  if stop=1
    break
  if (dir!=A_LoopFileDir)
  {
    tooltip,Сканирование файлов в папке %A_LoopFileDir%`nПросканированно %a_index% файла(ов).`nF1 - чтобы выйти.`nF2 - прервать и начать сравнение.
    dir:=A_LoopFileDir
  }
  counts++
  if (SkipLargeFiles=1 and A_LoopFileSizeMB>Fsize)
    continue
  name%a_index%:=A_LoopFileFullPath
  if A_LoopFileSize=0
    name%a_index%.="`n size=0"
;  size%a_index%:=A_LoopFileSize
  MD%a_index%:=FileMD5(A_LoopFileFullPath)
}
;msgbox,Найдено объектов: %counts%

; Определение совпадений
loop,% counts
{
  count++
;  name:=name%a_index%
;  if name%count% contains %exept%
;    continue
  if name%count%=
    continue
  tim++
  if tim>5
  {
    name:=name%a_index%
    tooltip,Сравнение файлов:`n%name%`n%a_index%\%counts%`nF1 - чтобы выйти.
    tim=
  }
  loop,% counts
  {
    if (count=a_index or MD%a_index%="")
      continue
;    if name%count% contains %exept%
;      continue
    if (MD%a_index%=MD%count%)
    {
;      list.= name%count% "---------------" name%a_index% "`n"
      if s=
        string:= name%count% "`n" name%a_index% "`n"
      else
        string:= name%a_index% "`n"
      file.Write(string)
;      exept.= name%a_index% ","
      MD%a_index%=
      s=1
    }
  }
  if s=1
  {
    string:= "`n"
    file.Write(string)
    s=
  }
}
tooltip
;msgbox,%list%
msgbox,Готово!
exitapp

f2::
stop=1
return

f1::
file.Close()
exitapp


FileMD5(sFile="", cSz=4) {  ; by SKAN www.autohotkey.com/community/viewtopic.php?t=64211
 cSz := (cSz<0||cSz>8) ? 2**22 : 2**(18+cSz), VarSetCapacity( Buffer,cSz,0 )
 hFil := DllCall( "CreateFile", Str,sFile,UInt,0x80000000, Int,3,Int,0,Int,3,Int,0,Int,0 )
 IfLess,hFil,1, Return,hFil
 hMod := DllCall( "LoadLibrary", Str,"advapi32.dll" )
 DllCall( "GetFileSizeEx", UInt,hFil, UInt,&Buffer ),    fSz := NumGet( Buffer,0,"Int64" )
 VarSetCapacity( MD5_CTX,104,0 ),    DllCall( "advapi32\MD5Init", UInt,&MD5_CTX )
 Loop % ( fSz//cSz + !!Mod( fSz,cSz ) )
   DllCall( "ReadFile", UInt,hFil, UInt,&Buffer, UInt,cSz, UIntP,bytesRead, UInt,0 )
 , DllCall( "advapi32\MD5Update", UInt,&MD5_CTX, UInt,&Buffer, UInt,bytesRead )
 DllCall( "advapi32\MD5Final", UInt,&MD5_CTX )
 DllCall( "CloseHandle", UInt,hFil )
 Loop % StrLen( Hex:="123456789ABCDEF0" )
  N := NumGet( MD5_CTX,87+A_Index,"Char"), MD5 .= SubStr(Hex,N>>4,1) . SubStr(Hex,N&15,1)
Return MD5, DllCall( "FreeLibrary", UInt,hMod )
}

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

14 (изменено: Ed, 2014-06-27 19:27:36)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Спасибо большое всем, оказалось все так просто, а ни Far, ни Total Commander не могут. Может быть, вместо msgbox сделать создание .txt файла в исследуемой папке?

Alectric
Насчет Ваших скриптов, в варианте с размером, files.txt должен сохранятся? А в MD5 сохраняется, но пустой.


Еще, не подскажет кто-нибудь как передать фокус обратно в браузер?

15

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

serzh82saratov, разжуй, плиз, алгоритм.

Res := [], Exist := [] 
Loop, C:\Users\sergey\Desktop\1\*.* 
    Exist[A_LoopFileSize] ? Res.Remove(A_LoopFileSize) 
        : Res[A_LoopFileSize] := A_LoopFileLongPath, Exist[A_LoopFileSize] := 1

16 (изменено: serzh82saratov, 2014-06-27 20:11:58)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Res := [], Exist := [] 

Создаём "простые" массивы.

Exist[A_LoopFileSize]

Смотрим есть ли ключ с таким индексом.

? Res.Remove(A_LoopFileSize) 

если есть, то удаляем из массива с результатом этот ключ, само собой с его значением - именем файла.

: Res[A_LoopFileSize] := A_LoopFileLongPath, Exist[A_LoopFileSize] := 1

если ключа нет, то в массив с результатами, в ключ с индексом равным размеру файла, записываем имя файла, и в проверочный массив в ключ с индексом равным размеру файла пишем просто 1, для дальнейших проверок на его присутствие.

For K, V in Res
    Files .= V "`n"

Да и в результате файлы будут отсортированы по размеру.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Alectric, 2014-06-27 20:44:59)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Ed пишет:

Alectric
Насчет Ваших скриптов, в варианте с размером, files.txt должен сохранятся? А в MD5 сохраняется, но пустой.

В варианте с размером нужно раскомментировать строку где происходит запись в файл (FileAppend).

А в MD5 сначала идет "сканирование файлов" - файл просто создается на рабочем столе и открывается на запись.
Затем идет "сравнение" - в файл записываются пути совпавших файлов.

Если файл пустой - значит абсолютно одинаковых файлов не было (файлы могут совпадать по размеру но содержимое у них может быть разным).
Либо функция определения хеш-суммы не работает на вашей версии ahk (не знаю, не проверял разные версии).
Вот код чтобы проверить:


file=c:\windows\regedit.exe
msgbox,% """"FileMD5(file)""""

FileMD5(sFile="", cSz=4) {  ; by SKAN www.autohotkey.com/community/viewtopic.php?t=64211
 cSz := (cSz<0||cSz>8) ? 2**22 : 2**(18+cSz), VarSetCapacity( Buffer,cSz,0 )
 hFil := DllCall( "CreateFile", Str,sFile,UInt,0x80000000, Int,3,Int,0,Int,3,Int,0,Int,0 )
 IfLess,hFil,1, Return,hFil
 hMod := DllCall( "LoadLibrary", Str,"advapi32.dll" )
 DllCall( "GetFileSizeEx", UInt,hFil, UInt,&Buffer ),    fSz := NumGet( Buffer,0,"Int64" )
 VarSetCapacity( MD5_CTX,104,0 ),    DllCall( "advapi32\MD5Init", UInt,&MD5_CTX )
 Loop % ( fSz//cSz + !!Mod( fSz,cSz ) )
   DllCall( "ReadFile", UInt,hFil, UInt,&Buffer, UInt,cSz, UIntP,bytesRead, UInt,0 )
 , DllCall( "advapi32\MD5Update", UInt,&MD5_CTX, UInt,&Buffer, UInt,bytesRead )
 DllCall( "advapi32\MD5Final", UInt,&MD5_CTX )
 DllCall( "CloseHandle", UInt,hFil )
 Loop % StrLen( Hex:="123456789ABCDEF0" )
  N := NumGet( MD5_CTX,87+A_Index,"Char"), MD5 .= SubStr(Hex,N>>4,1) . SubStr(Hex,N&15,1)
Return MD5, DllCall( "FreeLibrary", UInt,hMod )
}

Должно выдать что-то вроде: "2E2C937846A0B8789E5E91739284D17A".

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

18

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

А что за способ такой написания через запятую?

, Exist[A_LoopFileSize] := 1

19

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Операторы в выражениях

Запятая пишет:

Запятая (,). [v1.0.46+] Несколько выражений можно разместить в одной строке, если разделить их запятыми. Такое составное выражение обрабатывается слева направо. Наиболее часто это используется при выполнении множественных присвоений или вызовов функций в той же самой строке: x:=1 , y+=2 , ++index, func(). Это удобство оплачивается скоростью исполнения. Составное выражение может быть разбито на несколько строк, поскольку строка, начинающаяся с запятой (или с другого оператора), становится продолжением предыдущей строки.

Начиная с версии 1.0.46.01, переменная и знак равенства сразу после запятой обрабатываются как присвоение (:=). Например, все следующие выражения являются присвоениями: x:=1, y=2, a=b=c.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20 (изменено: Alectric, 2014-06-27 21:25:40)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Изменил свой последний код - добавил группировку одинаковых файлов, если их больше 2-х.
Пост №13.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

21 (изменено: Malcev, 2014-06-27 21:11:18)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Не получается:

a = 5
if a = 5
   b=6, c=7
msgbox % c

Вообще все эти сокращения создают трудности для прочтения кода.
Я бы вообще тернарные операторы запретил бы

22

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Не получается:

Вроде однозначно написано:

переменная и знак равенства сразу после запятой обрабатываются как присвоение (:=).

a = 5
if a = 5
   b:=6, c=7
msgbox % c

Я бы вообще тернарные операторы запретил бы

С нетерпением ждём новый скриптовый язык.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Неоднозначно для меня.
Почему так с становится переменной
b:=6, c=7
А так нет?
b=6, c=7
И там и там условие соблюдено.

переменная и знак равенства сразу после запятой обрабатываются как присвоение (:=).

24 (изменено: Alectric, 2014-06-27 21:31:03)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

переменная и знак равенства сразу после запятой обрабатываются как присвоение (:=).

Наверное...

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

25

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Alectric
Да, все отлично работает, поэтому я и выбрал "Размер" за основу, потому что по MD5 во многих ситуациях не подходит, работает только с абсолютно идентичными файлами.

Из пожеланий, хотелось бы вариант с "размером", иметь с интерфейсом выбора папки, как в MD5, и чтобы в files.txt записывались только не совпавшие по размеру, а не наоборот. Еще, можно было бы сделать вариант с выбором двух папок, для сравнения их друг с другом.

26

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Ed пишет:

иметь с интерфейсом выбора папки

Нужно добавить "FileSelectFolder".

Ed пишет:

чтобы в files.txt записывались только не совпавшие по размеру, а не наоборот.

Нужно подумать...

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

27

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Alectric
Можно и не сразу, Наверное...

a = 5
if a = 5
   b:=6, q:=w=4, c=7
msgbox % c

Malcev

И там и там условие соблюдено.

Нет оператор присвоения в выражении :=. То что далее можно использовать просто = сделано видимо для удобства, можно не использовать, не привыкли, пишите везде :=.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

serzh82saratov пишет:

Alectric
Можно и не сразу,

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

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

29

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Alectric пишет:
serzh82saratov пишет:

Alectric
Можно и не сразу,

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

Так об этом в справке и сказано, о чём был Ваш пост, в котором в отличие от моего было дополнительно выделено слово - сразу?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Нет оператор присвоения в выражении :=

А где там указано про именно оператор присвоения?
Там речь идет про переменную.
Неправильно это правило сформулировано.

31 (изменено: Alectric, 2014-06-27 23:05:07)

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

serzh82saratov пишет:
Alectric пишет:
serzh82saratov пишет:

Alectric
Можно и не сразу,

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

Так об этом в справке и сказано, о чём был Ваш пост, в котором в отличие от моего было дополнительно выделено слово - сразу?

По моему это уже не важно.
Но, скорей всего, я выделил это еще раз для Malcev'а.



Вот так выдает список файлов не имеющих совпадений по размеру, а также поиск в 2-х разных папках:

#SingleInstance,Force
SetBatchLines,-1

FileSelectFolder, path
FileSelectFolder, path2
;path=g:\
;path=%A_desktop%\test
SkipLargeFiles=1 ;пропускать файлы больше чем
Fsize=1 ; мегабайт
savefile=%A_desktop%\files.txt
count=-1

file := FileOpen(savefile, "w")
if !IsObject(file)
{
  MsgBox Can't open "%FileName%" for writing.
  exitapp
}

; Создаем 2-а массива и счетчик
loop,%path%\*.*,0,1
{
  if stop=1
    break
  if (dir!=A_LoopFileDir)
  {
    tooltip,Сканирование файлов в папке %A_LoopFileDir%`nПросканированно %a_index% файла(ов).`nF1 - чтобы выйти.`nF2 - прервать и начать сравнение.
    dir:=A_LoopFileDir
  }
  counts++
  if (SkipLargeFiles=1 and A_LoopFileSizeMB>Fsize)
    continue
  listname%a_index%:=A_LoopFileFullPath
  name%a_index%:=A_LoopFileFullPath
  if A_LoopFileSize=0
    name%a_index%.="`n size=0"
  size%a_index%:=A_LoopFileSize
;  MD%a_index%:=FileMD5(A_LoopFileFullPath)
}

loop,%path2%\*.*,0,1
{
  if stop=1
    break
  if (dir!=A_LoopFileDir)
  {
    tooltip,Сканирование файлов в папке %A_LoopFileDir%`nПросканированно %counts% файла(ов).`nF1 - чтобы выйти.`nF2 - прервать и начать сравнение.
    dir:=A_LoopFileDir
  }
  if (SkipLargeFiles=1 and A_LoopFileSizeMB>Fsize)
    continue
  listname%counts%:=A_LoopFileFullPath
  name%counts%:=A_LoopFileFullPath
  if A_LoopFileSize=0
    name%counts%.="`n size=0"
  size%counts%:=A_LoopFileSize
;  MD%counts%:=FileMD5(A_LoopFileFullPath)
counts++
}

;msgbox,Найдено объектов: %counts%

; Определение совпадений
loop,% counts
{
  count++
  name:=name%a_index%
;  if name%count% contains %exept%
;    continue
  if name%count%=
    continue
  tim++
  if tim>5
  {
    name:=name%a_index%
    tooltip,Сравнение файлов:`n%name%`n%a_index%\%counts%`nF1 - чтобы выйти.
    tim=
  }
  loop,% counts
  {
    if (count=a_index or size%a_index%="")
      continue
;    if name%count% contains %exept%
;      continue
    if (size%a_index%=size%count%)
    {
listname%count%=
listname%a_index%=
;      list.= name%count% "---------------" name%a_index% "`n"
      if s=
        string:= name%count% "`n" name%a_index% "`n"
      else
        string:= name%a_index% "`n"
;      file.Write(string)
;      exept.= name%a_index% ","
      size%a_index%=
      s++
    }
  }
  if s>0
  {
    string:= "`n"
    file.Write(string)
    s=
  }
}

loop,% counts
{
  if listname%a_index%!=
  {
    string:=listname%a_index% "`n"
    file.Write(string)
  }
}


tooltip
;msgbox,%list%
msgbox,Готово!
exitapp

f2::
stop=1
return

f1::
file.Close()
exitapp


FileMD5(sFile="", cSz=4) {  ; by SKAN www.autohotkey.com/community/viewtopic.php?t=64211
 cSz := (cSz<0||cSz>8) ? 2**22 : 2**(18+cSz), VarSetCapacity( Buffer,cSz,0 )
 hFil := DllCall( "CreateFile", Str,sFile,UInt,0x80000000, Int,3,Int,0,Int,3,Int,0,Int,0 )
 IfLess,hFil,1, Return,hFil
 hMod := DllCall( "LoadLibrary", Str,"advapi32.dll" )
 DllCall( "GetFileSizeEx", UInt,hFil, UInt,&Buffer ),    fSz := NumGet( Buffer,0,"Int64" )
 VarSetCapacity( MD5_CTX,104,0 ),    DllCall( "advapi32\MD5Init", UInt,&MD5_CTX )
 Loop % ( fSz//cSz + !!Mod( fSz,cSz ) )
   DllCall( "ReadFile", UInt,hFil, UInt,&Buffer, UInt,cSz, UIntP,bytesRead, UInt,0 )
 , DllCall( "advapi32\MD5Update", UInt,&MD5_CTX, UInt,&Buffer, UInt,bytesRead )
 DllCall( "advapi32\MD5Final", UInt,&MD5_CTX )
 DllCall( "CloseHandle", UInt,hFil )
 Loop % StrLen( Hex:="123456789ABCDEF0" )
  N := NumGet( MD5_CTX,87+A_Index,"Char"), MD5 .= SubStr(Hex,N>>4,1) . SubStr(Hex,N&15,1)
Return MD5, DllCall( "FreeLibrary", UInt,hMod )
}

Для MD5, думаю, нет смысла искать не совпавшие файлы.

Осталось только облагородить внешний вид кода и убрать лишнее, но это вы уж сами, а то что-то я устал.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

32

Re: AHK: Сравнить сотни файлов по размеру, игнорируя разность имен.

Alectric
Спасибо большое, главное, что работает.