local function norm(name)
name = mf.fsplit(name,0x4):match("%a.*")
return name and name:upper() or nil
end
Macro {
key="ShiftDivide";
area="Shell Search";
description="Select files with the same names without numeric prefix and extension";
condition=function()
return APanel.Visible and PPanel.Visible and not APanel.Empty and not PPanel.Empty
end;
action=function()
Panel.Select(0,0); Panel.Select(1,0)
local PTable={}
for ip=1,PPanel.ItemCount do
PTable[ip]=norm(Panel.Item(1,ip,0))
end
local a,p = {},{}
for ia=1,APanel.ItemCount do
local ANameOnly=norm(Panel.Item(0,ia,0))
if ANameOnly then
for ip,PNameOnly in pairs(PTable) do
if ANameOnly==PNameOnly then
a[#a+1],p[#p+1] = ia, ip
end
end
end
end
panel.SetSelection(nil,0,p,true)
panel.SetSelection(nil,1,a,true)
panel.RedrawPanel(nil,0)
panel.RedrawPanel(nil,1)
end;
}
Запускается сравнение комбинацией ShiftDidive
Авторы: KlepetoX (идея и первоначальная реализация), Shmuel (оптимизация)
Я в свою очередь дооптимизировал процесс выделения файлов, что оказалось существенно для скорости выполнения при очень большом количестве файлов.
Кроме того, "нормализацию" имени перед сравнением я выделил в функцию norm (name) (для удобства модификации скрипта под специфические задачи).
Сейчас там пропускается неалфавитный префикс, и отбрасывается расширение, но легко добавить, например, унификацию пробелов_подчёркиваний-минусов, игнорирование артиклей, и т.д.
"Нечёткое" сравнение файлов по именам
Posted: Thu 31 Oct, 2019 18:07
by Xerox
довольно круто
А есть ли плагин или макрос для нечеткого ПОИСКА?
Выглядит как "почти тоже самое", может быть легко реализуемо?
"Нечёткое" сравнение файлов по именам
Posted: Thu 31 Oct, 2019 20:49
by John Doe
Существуют готовые библиотеки, которые можно было бы приспособить.
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 10:00
by Shtirla
По названию тему подумал что здесь про алгоритм Дамерау-Ливенштайна, хотя с трудом представляю зачем это может понадобится при сравнении файлов.
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 15:48
by buniak_a_h
Xerox wrote: ↑Thu 31 Oct, 2019 18:07
А есть ли плагин или макрос для нечеткого ПОИСКА?
Извините, если открою америку... В поиске в именах файлов допустимы регэкспы (если начать и закончить слэшами). Ну и, соответственно, можно найти что хотите
Поиск по имени песни (перед названием может быть номер трека, пробел и дефис): /\d{0,2}\s*-?\s*.*\.mp3/i
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 15:53
by Xerox
John Doe
какие библиотеки? я профан
было бы очень даже замечательно, если бы кто-нибудь смог это сделать ..?
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 16:03
by Xerox
buniak_a_h,
Америка это хорошо, но что делать с переставленными местами, или вообще пропущенными словами?
в остальном - pегексп это хорошо, но синтакс неуклюжий и в результате неюзабельно даже для тех кто знает синтаксис
На данный момент я так ищу:
P.S.
Я подозреваю вам лучше поискать готовую утилиту, работающую из командной строки.
Таких существует много.
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 17:10
by HaRT
Xerox wrote: ↑Fri 01 Nov, 2019 16:03
что делать с переставленными местами, или вообще пропущенными словами?
Я после ваших вопросов вчера поискал и нашёл fzf. Судя по описанию, должно хорошо решать вашу задачу (и массу других). Да, Винда поддерживается; нет, собирать самому не требуется.
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 18:24
by Xerox
buniak_a_h, Да, реально спасибо!
Pешает задачу, хоть и несколько коряво
Я 20 минут разгадывал как задать глубину поиска по субдиректориям.
Нет такого параметра, но, слава богам что ФЗФ хавает пайпинг и соответственно фильтрует его
Например для самого верхнего уровня:
Но для заданного количества подуровней нет, надо будет корячить скрипт, который будет медленный конечно.
Если ты/вы/кто-нибудь знаком с другими подобными решениями (команд-лайн)?
Буду очень благодарен
PS
Еще пока не допер как задать список junk-words в FZF.. ?
Кажется что невозможно
Xerox wrote: ↑Fri 01 Nov, 2019 18:24
как задать список junk-words в FZF
В условиях поиска напишите перед словом !. Вы это имели в виду?
"Нечёткое" сравнение файлов по именам
Posted: Fri 01 Nov, 2019 18:48
by Xerox
HaRT, Не, это получается stop-words, a надо типа ignore-words
это чтобы, опять же, не морочиться с синтаксисом.
например, чтобы скопипастить имя файла, не заморачиваясь его чисткой от раширений и другого мусора, искать по meaning-words, игнорируя junk/ignore-words
Иначе junk и будет вылазить на топ-позицию
А следует бы задать один раз список игнорируемых слов, и усе, дальше расслабляемся.
(ну надеюсь что я себя обьяснил.. ?)
"Нечёткое" сравнение файлов по именам
Posted: Sat 09 Nov, 2019 08:57
by Xerox
Еще кстате AGREP делает что то вроде "гугля" по содержанию текстовых документов, т.е. не регексп, а по свободно заданным словам.
или если в него перенаправить список файлов, то может это отфильтровать
"Нечёткое" сравнение файлов по именам
Posted: Sun 10 Nov, 2019 17:39
by buniak_a_h
Xerox wrote: ↑Fri 01 Nov, 2019 16:03buniak_a_h,
Америка это хорошо, но что делать с переставленными местами, или вообще пропущенными словами?
в остальном - pегексп это хорошо, но синтакс неуклюжий и в результате неюзабельно даже для тех кто знает синтаксис
На данный момент я так ищу:
находит по словам в любом порядке, но тоже неуклюже
Вы навели меня на мысль. Я делал когда-то поиск с предпросмотром. Специально для такого случая доделал правила поиска файлов: теперь можно указать Lua-выражение в угловых скобках. Конкретно для Вашего случая вполне подходит, например, такое: <name:lower():match("sql") and name:lower():match("linux") and name:lower():match("install")>