Удаление дубликатов

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view

yuris5
Сообщения: 13
Зарегистрирован: Вс апр 01, 2007 18:26
Откуда: 02

Удаление дубликатов

Сообщение yuris5 »

Добрый день. Собственно сабж.
Пробовал SelNotFirst.vbs от Volniy но чёт не работает,
хотя не ошибок нет , нет и результата...
Может кто сделал, или знает как удалить дубликаты.
--------------------------------------------------------------------------------------
И ещё, есть прога DupDetector которая ищет похожие картинки (можно
задать % похожести), в результате выдает список в миниатюры
картинок, но грабли в том что если дупликатов тыщы, а удалять по
одному то :-(
Может кто знает как сделать подобное в нашем любимом ТС, но и для
других типов файлов (мр3, jpeg, и д.р.)
--------------------------------------------------------------------------------------
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Re: Удаление дубликатов

Сообщение Volniy »

yuris5 писал(а):Добрый день. Собственно сабж.
Пробовал SelNotFirst.vbs от Volniy но чёт не работает,
хотя не ошибок нет , нет и результата...
Может кто сделал, или знает как удалить дубликаты.
Нельзя ли поконкретнее, что делалось и что именно не получилось. Заранее скажу, что если скрипт использовался после поиска дубликатов со снятой галочкой "по имени", так он и не должен в таком случае работать (дубликаты скриптом определяются именно по именам файлов, без путей к ним).
yuris5
Сообщения: 13
Зарегистрирован: Вс апр 01, 2007 18:26
Откуда: 02

Re: Удаление дубликатов

Сообщение yuris5 »

Вау, мне ответил сам СОЗДАТЕЛЬ!
Уважаю (и часто пользуюсь скриптами) Volniy, но вот с этим - грабли. А может запустится... Итак:
В каталоге с папками и файлами делаю поиск файлов -> Дополнительно -> Поиск дубликатов: по имени и по размеру.
Далее Файлы на панель.
Далее жму кнопку:
button57=C:\WINDOWS\System32\WScript.exe
cmd57=""c:\Program Files\totalcmd651\plugins\util\SelNotFirst.vbs""
param57=""%L""
menu57=SelNotFirst

Код: Выделить всё

 ' File: SelNotFirst.vbs
' Description: Удаляет все парные файлы кроме первого
' из списка, созданного поиском дубликатов в ТС
' Installation: Создайте кнопку на панели TC
' Команда: "диск:\путь\к\файлу\SelNotFirst.vbs"
' Параметры: "%L"
' Copyright: (c) 2006, Volniy

Option Explicit
Dim FSO, ListFile, SelFile, TCS
Dim File1, File2, Cnt, Buf
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")
Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
Do While Not ListFile.AtEndOfStream
SelFile = ListFile.ReadLine
File2 = FSO.GetFileName(SelFile)
If StrComp(File1, File2, 1) = 0 Then
Buf = Buf & SelFile & vbNewLine
Cnt = Cnt + 1
End If
File1 = File2
Loop
ListFile.Close
TCS.ClearClip
TCS.SetTextToClip CStr(Buf)
TCS.SendCommand "cm_LoadSelectionFromClip", True
Set ListFile = Nothing
Set FSO = Nothing
Set TCS = Nothing
MsgBox "Выделено дубликатов: " & Cnt, vbInformation, "Завершено!"
WScript.Quit 
Выплевывает окно:
Завершено!
Выделено дубликатов:
ОК

В итоге ничего не выделено...
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Re: Удаление дубликатов

Сообщение Volniy »

yuris5 писал(а):В каталоге с папками и файлами делаю поиск файлов -> Дополнительно -> Поиск дубликатов: по имени и по размеру.
Далее Файлы на панель.
Далее жму кнопку:
button57=C:\WINDOWS\System32\WScript.exe
cmd57=""c:\Program Files\totalcmd651\plugins\util\SelNotFirst.vbs""
param57=""%L""
menu57=SelNotFirst
Ну ёмаё, надо же трошки задумываться все-таки, даже используя чужие наработки :wink:
Так вот, %L - это ведь путь к файлу-списку выделенных в активной панели файлов. Так что ты, кажись, пропустил:
Далее "Выделить всё"
перед
Далее жму кнопку:
А таперича работает?

PS Посмотрел свой старый пост с этим скриптом и что я там увидел? А вот что:
Не забыть только выделить весь список найденных дубликатов перед запуском скрипта!
yuris5
Сообщения: 13
Зарегистрирован: Вс апр 01, 2007 18:26
Откуда: 02

Re: Удаление дубликатов

Сообщение yuris5 »

Volniy писал(а): Так что ты, кажись, пропустил:
Далее "Выделить всё" перед
Далее жму кнопку:
А таперича работает?
Да! Теперь РАБОТАЕТ! :D
Вот бы ещё что бы работал при разных именах файлов...
Volniy писал(а): PS Посмотрел свой старый пост с этим скриптом и что я там увидел? А вот что:Не забыть только выделить весь список найденных дубликатов перед запуском скрипта!
[/quote]
Я бы тоже хотел бы увидеть старый пост...
А может кто подскажет где коллекция скриптов? :?:

И ещё один вопрос: как можно отметить файлы в панели "через один" т.е. в виде "зебры". Пробовал в скрипте отравлять нажатия клавиш {INSERT} и {DOWN} , но за перемещающимся курсором нету выделенных файлов... :-(
Аватара пользователя
aLexx
Сообщения: 442
Зарегистрирован: Пн мар 14, 2005 08:33
Откуда: Новокузнецк
Контактная информация:

Сообщение aLexx »

А напиши-ка сюды весь текст скрипта.
Наверняка, что-то не то делаешь... :)
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Re: Удаление дубликатов

Сообщение Volniy »

yuris5 писал(а):И ещё один вопрос: как можно отметить файлы в панели "через один" т.е. в виде "зебры".
Пишу код без тестирования, наобум. Я не понимаю, зачем это может быть нужно, но раз уж просили, то...

Код: Выделить всё

Option Explicit 
Dim FSO, ListFile, SelFile, TCS 
Dim File1, File2, Cnt, Buf 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set TCS = CreateObject("TCScript.Helper") 
Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1) 
Do While Not ListFile.AtEndOfStream 
SelFile = ListFile.ReadLine 
Cnt = Cnt + 1
File2 = FSO.GetFileName(SelFile) 
If Cnt Mod 2 = 0 Then 
   Buf = Buf & SelFile & vbNewLine 
End If 
Loop 
ListFile.Close 
TCS.ClearClip 
TCS.SetTextToClip CStr(Buf) 
TCS.SendCommand "cm_LoadSelectionFromClip", True 
Set ListFile = Nothing 
Set FSO = Nothing 
Set TCS = Nothing 
MsgBox "Выделено ""зеброй"":): " & Cnt \ 2 & " файлов", vbInformation, "Завершено!" 
WScript.Quit
yuris5
Сообщения: 13
Зарегистрирован: Вс апр 01, 2007 18:26
Откуда: 02

Re: Удаление дубликатов

Сообщение yuris5 »

-------------------------------------------------------------------------------
Огромное СПАСИБО г-ну Volniy за прекрасно работающий скрипт!
-------------------------------------------------------------------------------

И ещё один вопрос: Чем воспользоваться для поиска и удаления одинаковых по сути файлов музыки (mp3,wma,ogg, ...), но имеющих разный размер, название, битрейт. Предпологаю такая прога должна делать анализ файлов по образу огибающей звука.
Только не закидавайте, плз, ответами типа GO -> ya.ru ... google.com и п.т. :)
Аватара пользователя
funduk
Сообщения: 1515
Зарегистрирован: Вт авг 16, 2005 16:00
Откуда: Санкт-Петербург

Сообщение funduk »

Сортировка по длине тебя спасёт. Ну если там ещё и теги нормальные есть, то используй контентные плагины для аудио, например, AudioInfo.
Иногда бывает полезно сравнивать по содержимому одинаково закодированные файлы разного размера (только смотнреть надо на соответствующие места, не занятые тегами, а их ещё найти надо)...
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

И ещё один вопрос: как можно отметить файлы в панели "через один" т.е. в виде "зебры"
Чем больше вариантов, тем лучше, верно? Вот мои 5 копеек...
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Удаление дубликатов файлов с одинаковым размером

Сообщение Volniy »

yuris5 писал(а):Вот бы ещё что бы работал при разных именах файлов...
Неожиданно мне и самому это дело понадобилось. Вот вариант реализации скрипта. Не забываем об выделение всего списка с результатами поисков перед его применением. Строка с удалением только что выделенных строк закомментирована, это для самых смелых ;-)

Код: Выделить всё

'=====================[ Start of file ]========================= 

'  File:         SelNotFirstFileSize.vbs 
'  Description:  Выделяет все парные файлы, кроме первого, в списке, 
'                созданном поиском дубликатов ПО РАЗМЕРУ ФАЙЛА 
'  Installation: Создайте кнопку на панели TC 
'                Команда: "диск:\путь\к\файлу\SelNotFirstFileSize.vbs" 
'                Параметры: "%L"
'  Copyright:    (c) 2007, Volniy 

Option Explicit
Dim FSO, ListFile, SelFile,TCS
Dim Cnt, Buf, FileSize1, FileSize2
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")
Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
FileSize1 = -1
Do While Not ListFile.AtEndOfStream
  Set SelFile = FSO.GetFile(ListFile.ReadLine)
  FileSize2 = SelFile.Size
  If FileSize2 = FileSize1 Then
     Buf = Buf & SelFile & vbNewLine
     Cnt = Cnt + 1
  End If
  FileSize1 = FileSize2
Loop
ListFile.Close
TCS.SetTextToClip CStr(Buf)
TCS.SendCommand "cm_LoadSelectionFromClip", True
'TCS.SendCommand "cm_Delete", True
Set SelFile = Nothing
Set ListFile = Nothing
Set FSO = Nothing
Set TCS = Nothing
MsgBox "Выделено дубликатов: " & Cnt, vbInformation, "Завершено!"
WScript.Quit

'=====================[  End of file  ]=========================
В принципе можно использовать этот скрипт и c поиском файлов совпадающих по содержимому, но тут вас подстерегает не сразу заметная опасность. Теоретически существует вероятность (не высокая, но все-таки...) того, что в двух соседних группах найденных дубликатов окажутся файлы с одинаковыми размерами, но при этом не совпадающие по содержимому. При этом для удаления будет выделены все файлы второй по порядку следования группы и, как результат, можно будет остаться вообще без единого экземпляра той группы. Так что или понадобится дополнительный визуальный контроль за результатами выделения или нужно будет к скрипту прикручивать проверку файлов по содержимому (с помощью внешней утилиты командной строки или средствами скриптов, второе будет медленно и еще ненадежно с нетекстовыми файлами).

Замечание это, кстати, справедливо и для версии скрипта, работающей с дубликатами имен файлов.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Давно написал, но как-то всё не выкладывалось

Код: Выделить всё

@echo off &setlocal enableextensions &chcp 1251 >nul
rem Удаление дубликатов по хешу
rem Параметры: D:\папка
rem Автор: Tol!k
rem Используется RHash http://rhash.anz.ru/

set "folder=%~1"
if "%folder:~-1%"=="\" set "folder=%folder:~0,-1%"

set "hash="
for /f "tokens=1,*" %%a in (
'rhash.exe -M -r --ansi "%folder%" ^|sort'
) do call :dd "%%a" "%%b"
goto :eof

:dd
if "%hash%" == "%~1" (attrib -h %2 &del /q %2)
set "hash=%~1"
goto :eof
Аватара пользователя
Strek
Сообщения: 205
Зарегистрирован: Вс окт 17, 2010 23:10
Контактная информация:

Сообщение Strek »

Volniy
Что делаю не так?
YouTube
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Strek
А если с этим скриптом попробовать?
Аватара пользователя
Strek
Сообщения: 205
Зарегистрирован: Вс окт 17, 2010 23:10
Контактная информация:

Сообщение Strek »

sa
Изображение
Ответить