Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] необычный поиск дубликатов (http://forum.oszone.net/showthread.php?t=297591)

Alexander_88 28-03-2015 16:05 2488878

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

я хочу найти все файлы, в которых присутствуют энной или более кол-во одинаковых символов, т.е. я должен указать только цифру, например 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 2488973

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 2488981

Foreigner, ноги у темы здесь растут: Прочие - не стандартный поиск дубликатов файлов.

Foreigner 28-03-2015 20:53 2488990

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

Alexander_88 28-03-2015 21:30 2489007

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

Foreigner 29-03-2015 00:18 2489057

Цитата:

Цитата Alexander_88
хочу протестировать, а у меня экран сразу изчезае »

Добавьте в конец:
Код:

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

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

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

Цитата:

Цитата Alexander_88
а можно прописать слова для игнора »

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

Foreigner 29-03-2015 02:27 2489077

Код:

$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 2489105

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 2489114

Цитата:

Цитата Alexander_88
[0OPUD-1]: 00030rufig_OPUD-179_site.com.wmv
[0OPUD-1]: 00010tort_OPUD-181_site.com.wmv »

Ну правильно, в данном случае при разборе tort_ и rufig_ не учитываются.
Цитата:

Цитата Alexander_88
[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 2489152

сейчас нету fhd...., спасибо :)
Цитата:

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

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

Foreigner 29-03-2015 14:03 2489162

Alexander_88, Можно:
Код:

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

yurfed 29-03-2015 14:25 2489169

Alexander_88, если использование скриптов не принципиально, посмотрите в сторону Everything. Пожалуй на сегодня это самый быстрый поиск, удовлетворяющий вашим критериям.
http://www.voidtools.com/Everything-1.3.0.632b.exe

Alexander_88 29-03-2015 15:31 2489192

Цитата:

Цитата Foreigner
'\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 2489317

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

Foreigner 29-03-2015 21:34 2489346

Alexander_88, Уберите команду return и добавьте в конце:
Код:

return & {

....

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

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


Alexander_88 29-03-2015 22:06 2489356

а я вот этим вариантом пользовался

Код:

$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 2489383

Alexander_88, вы забыли '&', который был после return

Alexander_88 30-03-2015 01:19 2489393

спасибо, получилось


Время: 08:35.

Время: 08:35.
© OSzone.net 2001-