Войти

Показать полную графическую версию : [решено] необычный поиск дубликатов


Alexander_88
28-03-2015, 16:05
здравствуйте, реально ли осуществить вот такую задачку..

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

mydomain.com_хорошее кино.avi
mydomain.com_хорошая комедия.wmv
mydomain.com_камедиклаб.avi
mydomain.com_сигареты камел.avi
mydomain.com_стивен сигал.wmv

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

указываю количество символов 5 и более, указываю в списке игноров всего одно слово "mydomain.com_".
такие должны быть результаты:

хорошее кино.avi
хорошая комедия.wmv

если задал 4 и более, а слово игнор "mydomain.com_", результаты в виде группы

хорошее кино.avi
хорошая комедия.wmv
----------------------------------------------------
сигареты камел.avi
стивен сигал.wmv

если задал 3 и более, а слово игнор "mydomain.com_":

хорошее кино.avi
хорошая комедия.wmv
----------------------------------------------------
сигареты камел.avi
стивен сигал.wmv
-----------------------------------------------------
хорошая комедия.wmv
камедиклаб.avi
----------------------------------------------------
камедиклаб.avi
сигареты камел.avi

Если можно сделать проще посредством каких - то программ, подскажите, пожалуйста каких именно, в тотале коммандере, есть поиск посредством плагина, может существует такой плагин :o

Foreigner
28-03-2015, 20:26
PowerShell: Если такой вариант сортировки подойдет, то можно прицепить обработку файлов

$strings = 'хорошее кино',
'хорошая комедия',
'камедиклаб',
'сигареты камел',
'стивен сигал',
'хорек и камел'

3,4,5 | foreach {

$patterns = foreach ($s in $strings) {

for ($i = 0; $i -le ($s.length - $_); $i++) {

$s.substring($i,$_)

}}

"$($_):"

foreach ($p in ($patterns | sort -unique)) {

$res = $strings | where { $_ -match ".*${p}.*" } | foreach { $_ -replace $p,"[${p}]" }
if ($res.count -ge 2) { $res; '' }

}}

Я для наглядности поместил сходства в квадратные скобки. Результат выводится группами по совпадениям (3,4 и 5 букв)

Iska
28-03-2015, 20:38
Foreigner, ноги у темы здесь растут: Прочие - не стандартный поиск дубликатов файлов (http://forum.oszone.net/thread-297585.html).

Foreigner
28-03-2015, 20:53
Iska, там вроде не связано со скриптами. Ну ладно, что человек не делает, все делает для себя. Потренировался. Я кроме этого раздела никуда больше даже не заглядываю

Alexander_88
28-03-2015, 21:30
Foreigner, спасибо, хочу протестировать, а у меня экран сразу изчезает.. т.е. нажимаю на файле правой кнопкой, "выполнить power shell", потом на синем фоне все быстро пробегает и окно закрывается
и еще вопросик, а можно прописать слова для игнора и чтобы расширение игнорировало? дело в том, что на многих файлах стоит как префикс название одного и того же домена, но эти файлы не являются дубликатами

Foreigner
29-03-2015, 00:18
хочу протестировать, а у меня экран сразу изчезае »
Добавьте в конец:

...
}}
[console]::readkey($true)

или запишите результат в файл, исправьте последнюю строку:

...
}} | set-content 1.txt

а можно прописать слова для игнора »
Можно, но надо все делать в комплексе, в скрипте просто пример поиска строк в которых есть соответствия из 3-х, 4-х или 5-буквенных подстрок. Завтра, если не буду занят, адаптирую под ваши условия.

Foreigner
29-03-2015, 02:27
$notparse = 'mydomain.com_|mydomain.org_|www.ya.ru_' # не учитывается при поиске
$search_len = 4 # длина подстроки
$files = get-childitem "D:\Test" -recurse | where { -not $_.psiscontainer } # D:\Test -- путь к папке

$patterns = foreach ($f in $files) {

$f = $f.basename -replace $notparse
for ($i = 0; $i -le ($f.length - $search_len); $i++) {

$f.substring($i,$search_len)

}}

return & {

foreach ($p in ($patterns | sort -unique)) {

$res = $files | where { ($_.basename -replace $notparse) -match ".*${p}.*" } | foreach { "[${p}]: " + "$_" }
if ($res.count -ge 2) { $res; '' }

}} | set-content "D:\Test\result.txt"

Alexander_88
29-03-2015, 09:09
Foreigner, спасибо огромное.. оказывается я плохо пример сверху привел, там на самом деле гораздо больше совпадений))

только у меня вопросик:

1 - если у меня окно не изчезает и куча красного понаписано, мерцает, потом раз.. и останавливается (но окно не закрывается), я закрыл сам, открыл результаты, там уже записалось что-то, может нужно все же дождаться завершения, пока само закроется? (я прикрепил скрин)

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

пример:

я указал в игнор
rufig_
tort_
символов сделал 7

одно из совпадений

[0OPUD-1]: 00030rufig_OPUD-179_site.com.wmv
[0OPUD-1]: 00010tort_OPUD-181_site.com.wmv


3 - интересно откуда могло взяться вот такое?:

символы 6

[[FHD]C]: 00001tort_DCN-047_site.com.wmv
[[FHD]C]: DCN-043.avi

в принципи все правильно, 6 символов есть, но почему в замене такое написано? я попробовал переместить в другую папку отдельно эти два файла, тогда получилось все нормально [DCN-04].......... может ли скрипт записать в квадратные скобки что - то из соседних файлов? (просто есть файл [FHD]CORE-026.mkv)

Foreigner
29-03-2015, 10:36
[0OPUD-1]: 00030rufig_OPUD-179_site.com.wmv
[0OPUD-1]: 00010tort_OPUD-181_site.com.wmv »
Ну правильно, в данном случае при разборе tort_ и rufig_ не учитываются.
[FHD]CORE-026.mkv »
Это конечно плохо, дело в том, что для поиска используется регулярное выражение, а "[]" служат спецсимволами для регекспов, заранее я всего предусмотреть не могу...
Пока попробуйте так:

$notparse = 'mydomain.com_|mydomain.org_|www.ya.ru_|\[игнор\]' # Если присутствуют'[' и ']', то их надо экранировать '\[' и '\]'
$search_len = 7
$files = get-childitem .\test -recurse | where { -not $_.psiscontainer }

$patterns = foreach ($f in $files) {

$f = $f.basename -replace $notparse
for ($i = 0; $i -le ($f.length - $search_len); $i++) {

$f.substring($i,$search_len) -replace '(\[|\])','\$1'

}}

return & {

foreach ($p in ($patterns | sort -unique)) {

$res = $files | where { ($_.basename -replace $notparse) -match ".*${p}.*" } | foreach { "[${p}]: " + "$_" }
if ($res.count -ge 2) { $res -replace '\\'; '' }

}} | sc 1.txt

Если игнорируемая последовательность внутри строки (00030rufig_OPUD-179_site.com.wmv), то даже не знаю

Alexander_88
29-03-2015, 13:34
сейчас нету fhd...., спасибо :)
Если игнорируемая последовательность внутри строки (00030rufig_OPUD-179_site.com.wmv), то даже не знаю »
а нельзя сделать игнор, если встречается 5 цифр подряд? просто есть много файлов, которые начинаются всегда на пять цифр, но эти цифры не нужно сравнивать (пример имени файла выше)
или можно прописать в игнор случайные символы?, к примеру *rufig_, где * это случайные цифры перед словом.., я даже могу их кол-во задать, их будет 5, например #####rufig_

Foreigner
29-03-2015, 14:03
Alexander_88, Можно:

$notparse = '\d{5}|.+rufig_'


'\d{5}' -- пять цифр
'|' -- логическое 'или'
'.+rufig_' -- один или более символов перед rufig_

yurfed
29-03-2015, 14:25
Alexander_88, если использование скриптов не принципиально, посмотрите в сторону Everything (http://freealt.net/2013/01/24/everythin/). Пожалуй на сегодня это самый быстрый поиск, удовлетворяющий вашим критериям.
http://www.voidtools.com/Everything-1.3.0.632b.exe

Alexander_88
29-03-2015, 15:31
'\d{5}' -- пять цифр
'|' -- логическое 'или'
'.+rufig_' -- один или более символов перед rufig_ »

сейчас, все как нужно, лишнего нету.. благодарю :)


yurfed интересно, а где можно количесво символов там настроить?
я прочитал справку

Функции:
attrib:<атрибуты> Найти файлы и папки с указанными файловыми атрибутами
attributes:<атрибуты> Найти файлы и папки с указанными файловыми атрибутами
child:<имя_файла> Найти папки, содержащие файл с подходящим именем
dateaccessed:<дата> Найти файлы и папки с указанной датой последнего доступа
datecreated:<дата> Найти файлы и папки с указанной датой создания
datemodified:<дата> Найти файлы и папки с указанной датой изменения
daterun:<дата> Найти файлы и папки с указанной датой запуска
da:<дата> Найти файлы и папки с указанной датой последнего доступа
dc:<дата> Найти файлы и папки с указанной датой создания
dm:<дата> Найти файлы и папки с указанной датой изменения
dr:<дата> Найти файлы и папки с указанной датой запуска
dupe: Найти дублирующиеся имена файлов
empty: Найти пустые папки
ext:<список> Найти файлы с подходящим расширением из указанного списка расширений, разделённых точкой с запятой (;)
fsi:<индекс> Найти файлы и папки в указанном внутреннем индексе файловой системы с базой 0
len:<длина> Найти файлы и папки с именами указанной длины
parents:<кол-во> Найти файлы и папки с указанным количеством родительских папок
rc:<дата> Найти файлы и папки с указанной датой последнего изменения
recentchange:<дата> Найти файлы и папки с указанной датой последнего изменения
root: Найти файлы и папки, не имеющие родительских папок
runcount:<число> Найти файлы и папки, запущенные указанное количество раз
size:<размер> Найти файлы указанного размера (в байтах)
type:<тип> Найти файлы и папки указанного типа

не нашел там, что то типа "найти файлы в которых сходятся энное кол-во символов"

Alexander_88
29-03-2015, 20:43
не подскажете, что нужно прописать в конец, чтобы открыть этот финальный файл тхт в блокноте, ищу в гугле как открыть тхт, вроде не сложно должно быть, и нигде не могу найти

Foreigner
29-03-2015, 21:34
Alexander_88, Уберите команду return и добавьте в конце:

return & {

....

}} | set-content "D:\Test\result.txt"

invoke-item "D:\Test\result.txt"

Alexander_88
29-03-2015, 22:06
а я вот этим вариантом пользовался

$notparse = 'mydomain.com_|mydomain.org_|www.ya.ru_|\[игнор\]' # Если присутствуют'[' и ']', то их надо экранировать '\[' и '\]'
$search_len = 7
$files = get-childitem .\test -recurse | where { -not $_.psiscontainer }

$patterns = foreach ($f in $files) {

$f = $f.basename -replace $notparse
for ($i = 0; $i -le ($f.length - $search_len); $i++) {

$f.substring($i,$search_len) -replace '(\[|\])','\$1'

}}

return & {

foreach ($p in ($patterns | sort -unique)) {

$res = $files | where { ($_.basename -replace $notparse) -match ".*${p}.*" } | foreach { "[${p}]: " + "$_" }
if ($res.count -ge 2) { $res -replace '\\'; '' }

}} | sc 1.txt



сделал вот так , но не получается что - то

$notparse = 'mydomain.com_|mydomain.org_|www.ya.ru_|\[игнор\]' # Если присутствуют'[' и ']', то их надо экранировать '\[' и '\]'
$search_len = 7
$files = get-childitem .\test -recurse | where { -not $_.psiscontainer }

$patterns = foreach ($f in $files) {

$f = $f.basename -replace $notparse
for ($i = 0; $i -le ($f.length - $search_len); $i++) {

$f.substring($i,$search_len) -replace '(\[|\])','\$1'

}}

{

foreach ($p in ($patterns | sort -unique)) {

$res = $files | where { ($_.basename -replace $notparse) -match ".*${p}.*" } | foreach { "[${p}]: " + "$_" }
if ($res.count -ge 2) { $res -replace '\\'; '' }

}} | sc 1.txt
invoke-item 1.txt

Foreigner
30-03-2015, 00:29
Alexander_88, вы забыли '&', который был после return

Alexander_88
30-03-2015, 01:19
спасибо, получилось




© OSzone.net 2001-2012