Компьютерный форум 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=345320)

Peutrov 26-05-2020 03:42 2922680

поиск уникальных файлов
 
Есть папка с множеством подпапок, подподпапок и т.д. В них много файлов-дубликатов и мало уникальных файлов.
Как быстро найти только уникальные? (Сравнение по имени и размеру файла)

Total Commander прекрасно ищет дубликаты. Но уникальный файл подсветить не может.
Файлы надо только найти: удалять, перемещать нельзя.
Существует ли простое решение?
Спасибо

Iska 26-05-2020 20:24 2922828

Цитата:

Цитата Peutrov
Существует ли простое решение? »

Конечно. Скрипт на PowerShell будет вполне универсальным решением.

Что Вы с этими файлами дальше делать будете?

Peutrov 26-05-2020 22:42 2922852

Цитата:

Цитата Iska
Скрипт на PowerShell »

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

DJ Mogarych 27-05-2020 09:13 2922909

Цитата:

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

Код там проще пареной репы. Вот вывод списка:
Код:

dir D:\Downloads -File -Recurse |sort name -Unique |sort length -Unique
Копирование или перемещение - это ещё всего лишь одна команда.

megaloman 27-05-2020 14:46 2922965

DJ Mogarych, Попробовал Ваш код. В папку (пускай D:\Downloads) скопировал другую папку с подпапками и файлами в них. В этой же папке создал подпапку и скопировал туда то же самое. Один файл изменил. Похоже, приведенная команда перечисляет все файлы.

Foreigner 27-05-2020 15:46 2922972

pwsh
Код:

((gci /data/downloads -File -Recurse | group length | group name).group | where count -eq 1).group.fullname

greg zakharov 27-05-2020 16:56 2922982

Уникальность файла определяется его энтропией, а не размером (не говоря о названии). И приведенные выше примеры не учитывают этот нюанс. Если с расчетом уникальности не хочется заморачиваться, более или менее верным будет удаление дубликатов по хэшу.
Код:

(gci X:\Path -file -r | Get-FileHash | group Hash).Where{$_.Count -gt 1}.ForEach{$_.Group | select -exp Path -skip 1} | ri -fo

Iska 27-05-2020 20:54 2923005

Цитата:

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

Можно. Собранные скриптом имена файлов помещаете вместе с путями в текстовый файл, берёте Far Manager, открываете список файлов из текстового файла во временной панели и работаете с ними, как обычными ссылками на файлы — т.е., можете обычным для Far Manager'а образом копировать файлы, перемещать, удалять, просматривать, редактировать и т.п.

DJ Mogarych 27-05-2020 21:31 2923016

Цитата:

Цитата greg zakharov
Уникальность файла определяется его энтропией, а не размером (не говоря о названии). »

Это было ясно с самого начала, но ТС хотел именно размер и имя.
Расчёт хэша - вещь хорошая, но выполняться это будет весьма небыстро.

greg zakharov 27-05-2020 22:13 2923025

DJ Mogarych, будучи нарывом на заднице ложкой дёгтя в бочке меда, хочу ещё раз указать, что уникальность не может определяться такими параметрами как размер и имя: файлы по размеру могут быть и одинаковы, но вы же не станете закладываться на детородный орган почку, дескать, их содержание также одинаково, верно? На счет имён - вообще отдельный разговор. Так что либо хэши, либо unsafe код и энтропия.
Цитата:

Цитата DJ Mogarych
Расчёт хэша - вещь хорошая, но выполняться это будет весьма небыстро.

Благодартвуйте, кэп!

Foreigner 27-05-2020 22:56 2923028

Справедливости ради Get-FileHash берет hash содержимого файла. Возьмите его у двух одинаковых файлов с разными именами.

greg zakharov 28-05-2020 00:24 2923033

Цитата:

Цитата Foreigner
Справедливости ради Get-FileHash берет hash содержимого файла. Возьмите его у двух одинаковых файлов с разными именами.

Реплика в сторону, надо полагать?! Ежели нет, не переживайте титул кэпа переходящий трофей. Имя файла - всего лишь метка, относительно которой идет считывание данных с диска (если утрированно), в то время как содержимое файла представлено набором байтов, относительно которых и ведется расчет контрольной суммы.

Peutrov 28-05-2020 00:34 2923034

Цитата:

Цитата DJ Mogarych
Это было ясно с самого начала, но ТС хотел именно размер и имя.
Расчёт хэша - вещь хорошая, но выполняться это будет весьма небыстро. »

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

Foreigner 28-05-2020 00:49 2923036

Цитата:

Цитата greg zakharov
Ежели нет, не переживайте титул кэпа переходящий трофей. »

В принципе можно и по хэшу.

greg zakharov 28-05-2020 01:11 2923037

Уникальность - то, что делает предмет универсальным. И если до вас в 100500 раз не дошла простая истина, что сама по себе постановка вопроса лишена логики и противоречит смысловой нагрузке русского языка, видимо форуму так и предстоит топтаться на месте, где львиную долю составляют вопросы вроде "как переместить файл".

DJ Mogarych 28-05-2020 08:36 2923045

Так как Get-FileHash по умолчанию рассчитывает SHA1, можно ускорить обработку, задав ему алгоритм MD5:
Код:

Get-FileHash -Algorithm MD5

greg zakharov 28-05-2020 09:47 2923052

DJ Mogarych, по умолчанию используется SHA256. MD5 подвержен коллизиям и не рекомендуется к использованию (неоднократно сталкивался с оным на практике). К слову, SHA256 также можно атаковать, но возможность коллизии ниже на порядок. Если исполнение сценария критично по времени, имеет смысл, как было сказано ранее, использовать unsafe код (благо в pwsh такая возможность имеется, в смысле не нужно использовать Add-Type). Да, код получится длиннее, но работать будет очень быстро.

DJ Mogarych 28-05-2020 09:51 2923053

Цитата:

Цитата greg zakharov
по умолчанию используется SHA256 »

Да, верно, перепутал.
Цитата:

Цитата greg zakharov
MD5 подвержен коллизиям »

Я знаю, но в данном случае вероятность таких тонкостей стремится к нулю.

greg zakharov 28-05-2020 09:59 2923054

Тем не менее, предосторожности ради лучше отказаться от MD5.

greg zakharov 30-05-2020 20:03 2923338

Хоба!

Foreigner 30-05-2020 22:08 2923348

Вложений: 1
с символическими ссылками тоже возможны коллизии

greg zakharov 30-05-2020 22:33 2923349

Если dummy.txt ссылается на dummy.exe, понятное дело хэши совпадут (причем не только SHA-256, можно браться за любой алгоритм, хоть даже KECCAK), так как обрабатываться будет не ссылка как таковая, а конечный объект ФС, - это не коллизия. Чтобы получить хэш самой ссылки, вам придется обратиться к потокам.

DJ Mogarych 31-05-2020 15:58 2923428

Цитата:

Цитата greg zakharov
Хоба! »

Ещё раз: в данном случае это несущественно, потому что, помимо хэша, сравнение идёт и по именам файлов, и по их размеру. В вашем примере файлы неодинаковы по всем параметрам, кроме хэша.

greg zakharov 31-05-2020 17:20 2923448

Цитата:

Цитата DJ Mogarych
это несущественно, потому что, помимо хэша, сравнение идёт и по именам файлов

Еще раз перечитайте название темы, также перечитайте мои прежние сообщения, дабы уяснить что имя файла - в грубом округлении, - метка для идентификации последовательности байтов, также как и количество байтов не является уникальной величиной. Вы прямо как Иринушка из рассказа Пантелеева "Буква 'ты'".

DJ Mogarych 31-05-2020 20:14 2923484

Также и вы уясните, что в данном случае речь идёт об одновременном сравнении двух или трёх параметров, которые, не являясь уникальными по отдельности, вместе дают достаточную точность.

greg zakharov 31-05-2020 20:37 2923490

DJ Mogarych, популярно, на пальцах. Допустим, есть три файла с названием dummy с одинаковым размером. В вашем понимании файлы являются просто дубликатами, однако, заглянув в содержимое, вы вдруг обнаруживаете различный порядок байтов. Потенциально хэши (если речь о SHA256) будут различны и потому такие файлы можно считать уникальными, они не будут удалены. А теперь представьте кучу разных файлов с разными именами, но одинаковым содержимом разбросанные по папкам. Будут ли они уникальны? Ответ - нет. Почему? Уникальностью называют содержимое, а не внешние факторы. Вы же не станете утверждать, что каждый человек уникален по-своему лишь потому, что он или она - человек?! Говоря об уникальности, вы разумеете содержание.

Удачи вам в ваших заблуждениях.


Время: 08:43.

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