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

Обсуждение Total Commander. Установка, использование, настройка, решение проблем, скрытые функции. Обсуждение новых версий.

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar писал(а):выделять файлы или папки с определенным количеством символов в имени
Не понял связи. Шаг - одна схема, кол-во символов - другая. Одно с другим логически не вяжется. При разной сортировке подобные файлы могут быть разбросаны как угодно. Соответственно, шага как такового не будет. Как вариант можно фильтровать по кол-ву символов командой cm_SrcUserDef и уже в таком списке выделять с шагом.
shveicar писал(а):параметр - начальная позиция, мне не совсем понятен
Первый выделенный элемент. Этот параметр должен быть не больше второго, тогда можно подставлять разные значения.
shveicar писал(а):Ксати - в оригинале этот скрипт, у меня, почему то не работает.
Сочувствую. )
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

Добрый вечер, Спасибо за ответ,
Как вариант можно фильтровать по кол-ву символов командой cm_SrcUserDef
Если я правильно понял имеется ввиду поиск исходя из регулярных выражений. К сожалению это не всегда удобно. Ну например в открытой панели большой список имен файлов, Поскольку команда -упорядочить их по типу (не всегда адекватна). Во многих случаях удобно выделять файлы по длине имени файла(то есть например 10 символов(буквы или цифры)) - чтобы создать затем файл список, конечно во многих случаях удобно и выделение с шагом, Если возможно, подскажите вариант выделения нужного количества символов, За Сочувствие - Спасибо.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

shveicar писал(а):Если я правильно понял имеется ввиду поиск исходя из регулярных выражений.
Нет. Я где-то про поиск писал? Я писал о фильтре. См., что выводит команда. Для данного случая предлагается в скрипте создать цикл с подстановкой знаков вопроса, кол-во которых ограничено заданным максимумом и которые вставляются в поле диалога (?????.???/*) с последующим подтверждением.
shveicar писал(а):Во многих случаях удобно выделять файлы по длине имени файла(то есть например 10 символов(буквы или цифры)) - чтобы создать затем файл список, конечно во многих случаях удобно и выделение с шагом
Чисто из любопытства, примеры подобного удобства можно привести?
shveicar писал(а): Если возможно, подскажите вариант выделения нужного количества символов
Не понял. При чём тут выделение символов? Символы выделяются только у одного файла при переименовании. Я так думал, что речь о выделении в файловой панели элементов списка , имеющих N-ое кол-во символов. Кстати, это кол-во включает точку и расширение?

На всякий случай сообщаю, для меня есть смысл решать вопрос выделения по кол-ву символов в отдельном топике.
Аватара пользователя
shveicar
Сообщения: 277
Зарегистрирован: Пн апр 18, 2011 01:54
Откуда: Россия Москва

Сообщение shveicar »

На всякий случай сообщаю, для меня есть смысл решать вопрос выделения по кол-ву символов в отдельном топике
Что-ж, создам отдельный топик .
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Немного модифицировал.

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

'========================================================================= 
' Выделить элементы с заданным интервалом, начиная с элемента под курсором

' Необходима регистрация Script Helper ActiveX for TC

' Параметры: %N <режим выделения> <шаг>
' Режим выделения: 1 - всё; 2 - только файлы; 3 - только папки
' Пример: %N 2 5
'========================================================================= 
On Error Resume Next
With WScript.Arguments
  Start = .Item(0)
  Mode  = .Item(1)
  Step  = .Item(2)
End With

Set D = CreateObject("Scripting.Dictionary") 
With CreateObject("TCScript.Helper")
  .LockTC True
  T = .GetTextFromClip
  .SendCommand 330&Mode
  List = .GetSrcSelectedFiles(0)
  UL = UBound(List)
  .SendCommand 524
  i = 0
  For Each F in List
    D.Add F, i
    i = i + 1
  Next
  If Abs(UL) >= Abs(Step) Then
    For n = D.Item(Start) To UL
      Sp = Sp & List(n) & vbNewLine
      n = n + Step
    Next
    .SetTextToClip CStr(Sp)
    .SendCommand 2033, True
  End If
  .SetTextToClip(T)
  .LockTC False
End With
Set D = Nothing
WScript.Quit
Erema
Сообщения: 5
Зарегистрирован: Вс июл 27, 2008 12:38
Откуда: Far East

Сообщение Erema »

В простых случаях (когда дублирующие файлы находятся не на одном уровне каталога с исходными) поможет простая команда: "Выделить всё с этим путём"). 8)

Но просмотреть "глазками" результат всё же рекомендуется. :roll:
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Erema
И какое отношение выделение всех файлов, расположенных в одной директории, имеет к выделению дубликатов или выделению с заданным шагом?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Навеяло постом от Erema.
Если просто требуется выделить дубликаты для файла под курсором в обычной файловой панели (не результатах поиска), то можно воспользоваться командой “Выделить все файлы по текущему имени+расширению” (cm_SelectCurrentNameExt), применённой для вида без подкаталогов (Ctrl+B). Кнопка с использованием утилиты TCMC:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCMC\TCMC.exe
cm540 cm2026 cm543 cm2023 cm524 cm537 cm2053 cm525
WCMICONS.DLL,70
Выделить в подкаталогах дубликаты файла под курсором по имени+расширению


-1
Кнопка с использованием TCFS2:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef  "run_item(locktc, 1) tcm(540) tcm(2026) tcm(543) tcm(2023) tcm(524) tcm(537) tcm(2053) tcm(525) run_item(locktc, 0) run_item(update)"
WCMICONS.DLL,70
Выделить в подкаталогах дубликаты файла под курсором по имени+расширению


-1
Такой способ работает, правда, при большом количестве файлов гораздо медленнее, чем обычный поиск.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

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

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

'================================================================
'  Описание:  Выделить дубликаты файла под курсором,
'            находящиеся в папке и подпапках пассивной панели.
'             Имя файла может быть дополнено маской,
'            задаваемой вторым параметром скрипта. Например,
'            строка параметров %P%N%Z * позволит выделить файлы
'            с именами, начинающимися с имени файла под курсором.
' Параметры: %P%N%Z [маска]
'Требования: Необходима регистрация WSH Helper for TC by Volniy
'================================================================
Option Explicit
Dim FSO, TCS, P_N, P_N_Suf, PosPnt, PasDir, TextClip
If WScript.Arguments.Count < 1 Then
  MsgBox "Не указаны параметры: %P%N%Z", _
   vbOKOnly + vbCritical, "Выделение дубликатов файла"
  WScript.Quit
End If
P_N = WScript.Arguments(0)
PosPnt = InStrRev(P_N,".")
If WScript.Arguments.Count > 1 Then
   If PosPnt > InStrRev(P_N,"\") Then
      P_N_Suf = Mid(P_N, 1, PosPnt - 1) & WScript.Arguments(1) _
       & Mid(P_N, PosPnt)
   Else
      P_N_Suf = P_N & WScript.Arguments(1)
   End If
Else
   P_N_Suf = P_N
End If
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FolderExists(P_N) or InStrRev(P_N,"\") = Len(P_N) Then
  MsgBox "Курсор должен располагаться на файле", _
   vbOKOnly + vbCritical,  "Выделение дубликатов файла"
  Set FSO = Nothing
  WScript.Quit
End If
Set TCS = CreateObject("TCScript.Helper")
TextClip = TCS.GetTextFromClip
TCS.LockTC True
TCS.SendKeystroke "{TAB}"
TCS.SendCommand  "cm_RereadSource", True
PasDir = TCS.GetSrcPath
TCS.SendCommand "cm_DirBranch", True
TCS.SetTextToClip "*""" & Mid(P_N_Suf, InStrRev(P_N_Suf,"\") + 1) & """"
TCS.SendCommand "cm_LoadSelectionFromClip", True
TCS.SendCommand "cm_ShowOnlySelected", True
If InStr(LCase(P_N), LCase(PasDir)) = 1 Then
   TCS.SetTextToClip Mid(P_N, Len(PasDir) + 2)
   TCS.SendCommand "cm_LoadSelectionFromClip", True
   TCS.SendCommand "cm_ExchangeSelection", True
End If
TCS.SendKeystroke "{TAB}"
TCS.LockTC False
TCS.SetTextToClip(TextClip)
Set FSO = Nothing
Set TCS = Nothing
Wscript.Quit
Сама кнопка:

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

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\VBS\Выделить дубликаты на пассивной панели.vbs"
%P%N%Z
WCMICONS.DLL,70
Выделить дубликаты на пассивной панели


-1
P.S.
1. Чтобы перейти к нужному файлу на пассивной панели необходимо установить на него курсор и нажать Ctrl+B (вызвать команду “Показать все файлы без подкаталогов” для снятия этого вида).
2. Вернуть обычный вид панели можно с помощью F2 (команда “Обновить содержимое панели”) - независимо от местоположения курсора на пассивной панели, либо той же командой Ctrl+B, при условии, что курсор расположен на строке [..].
3. Дубликаты можно искать также и из архивов активной панели, только надо учесть: если расположить курсор на папке в таком архиве, то скрипт будет пытаться найти дубликаты среди файлов.
4. Дубликаты выделяются без учёта даты (времени), размеров и содержимого файлов, только по имени+расширению, либо, в виде опции, по имени+маске+расширению.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Может, кто-нибудь подскажет скрипт для выделения дубликатов по содержимому? (желательно, без использования Script Helper).
Т.е., чтобы работало выделение при отображении дубликатов на самой панели (после поиска дубликатов в TC). Например, чтобы выделялись все файлы в группе, кроме первого. Число одинаковых файлов в группе - разное.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Nick
Num+ в панели с найденными дубликатами (TC 8.50 и выше). Там всё это есть без всяких скриптов.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Могу по размеру предложить:

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

'=============================================================
' Выделить файлы, одноразмерные с первыми в группах дубликатов
' Параметр: %P
'=================== Путь к утилите TCFS2 ====================
TCFS2 = """%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe"""
'=============================================================
If WScript.Arguments.Count Then WScript.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
R = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1407"
With CreateObject("WScript.Shell")
  .Run TCFS2 & " /ef msg($0B,0) tcm(3302) tcm(2018) tcm(3304)",,True
  On Error Resume Next
  A = .RegRead(R) : If A > 0 Or Err.Number <> 0 Then .RegWrite R, 0, "REG_DWORD"
  List = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
  For Each F in Split(List, vbNewLine)
    Size1 = FSO.GetFile(F).Size
    If CStr(Size1) = CStr(Size2) Then S = S & vbNewLine & F
    Size2 = Size1
  Next : Temp = CreateObject("Shell.Application").NameSpace(._
  Environment("Process")("TEMP")).Self.Path & "\" & FSO.GetTempName
  FSO.CreateTextFile(Temp,,True).Write S
  .Run "%comspec% /c clip < """ & Temp & """", 0, True
  .Run TCFS2 & " /ef msg($0B,1) tcm(2033)"
  .Run "%comspec% /c type|clip ", 0
  FSO.DeleteFile Temp, 1 : If A > 0 Then .RegWrite R, A, "REG_DWORD"
End With
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Avada
Ok. Такого выделения давно не хватало. Наверно, достали автора с подобными запросами и он таки решил сделать. И справки по этому пункту даже еще и нету. Также, что неудобно, при Num+ - сбрасывается NumLock.
Flasher
Спасибо за скрипт (без Script Helper). Я стараюсь, по возможности все же использовать сравнение по содержимому, т.к. часто бывает, что размеры - одинаковые, а содержимое - разное. Тратится, конечно, намного больше времени, но зато - надежнее.

P.S. Можно ли как-то еще сделать, чтобы отметка сохранялась (при поиске через Alt+F7) на опции "по содержимому", а не перебрасывалась на отметку "по имени"?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Nick
Английская справка содержит всё, что следует, с момента появления новых возможностей. Найдите там через указатель справки раздел Dialog box: Select duplicate files или перейдите по ссылке из раздела Selecting files. А русская справка для 8.5x пока не готова.
Открытие диалога привязано не к клавише как таковой, а к команде "Выделить группу..." (cm_SpreadSelection), которую можно вызывать, разумеется, и другими способами.
Опции поиска дубликатов сейчас не сохраняются, но никто не мешает создать с нужными опциями шаблон поиска и вызывать его далее как параметр команды LOADSEARCH. См. здесь.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Nick писал(а):Я стараюсь, по возможности все же использовать сравнение по содержимому, т.к. часто бывает, что размеры - одинаковые, а содержимое - разное.
Я имел в виду выделение по размеру, а не поиск. Искать-то можно хоть так, хоть эдак, неважно.
Вероятность, что две ближайшие группы совпадут по размеру, но окажутся разными по содержимому = 0,0000000000000001%. Изображение
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить