Любители скачивать из интернета всё подряд во время плановой оптимизации системы нередко обнаруживают у себя на диске множество дубликатов файлов, если программа-оптимизатор умеет находить одинаковые файлы не только по названиям, но и по контрольным суммам. Например, всем известный чистильщик CCleaner явно испытывает с этим проблемы, выполняя поиск дубликатов только по названию и содержимому.
Хорошо, не подходит CCleaner, всегда можно найти более специализированную программу, но давайте представим другую ситуацию: вам нужно освободить на жестком диске место, но так, чтобы сами записи о дубликатах остались.
Сделать это можно, не прибегая к помощи сторонних программ, воспользовавшись встроенными средствами операционной системы, а именно PowerShell, заменив дублирующийся файлы жесткими ссылками. Если кто не в курсе, жесткая ссылка — это нечто вроде специального ярлыка, описывающий элемент файла, на который указывает эта ссылка. Кроме названия (имена Hard Link могут отличаться от файлов), внешне такая ссылка практически ничем не отличается от файла, удаление последней жесткой ссылки на файл приводит к удалению самого файла.
Для решения поставленной задачи мы предлагаем использовать готовый скрипт, написанный неким Василием Гусевым и впоследствии доработанный Вадимом Стеркиным на пару с самим автором.
Скачать его вы можете по ссылке - disk.yandex.ru/d/5Vi672Tkpfk0FA.
Откройте PowerShell, перейдите с помощью команды cd в расположение скрипта и запустите его следующей командой, передав ему в качестве аргументов пути к анализируемым папкам:
.\replacing-duplicates-hard-links.ps1 -dir1 D:\data1 -dir2 D:\data2
Если при выполнении скрипта вы получите ошибку, а так скорее всего и будет, разрешите исполнение скриптов PowerShell командой Set-ExecutionPolicy RemoteSigned -Scope Currentuser с подтверждением и повторите запуск скрипта.
Скрипт вычисляет контрольные суммы в сравниваемых каталогах, после чего файлы группируются, а найденные дубликаты в папке data1 удаляются и заменяются жесткими ссылками.
Если дубликат файла отсутствует, в консоли выводится уведомление «файл не найден». Проверить, что файл в папке действительно «превратился» в жесткую ссылку можно командой fsutil hardlink list настоящий файл, — путь к жесткой ссылке будет указан во второй строке.
Тем, у кого-то возникнут проблемы со скриптом, можно порекомендовать Dupemerge — стороннюю консольную утилиту, служащую тем же целям, что и скрипт, но более функциональную и информативную.
Простейшая команда поиска дубликатов и замены их жесткими ссылками в PowerShell выглядит следующим образом:
./dupemerge D:/data1 D:/data2, при этом тулза выводит отчет о проделанной работе.
Dupemerge: https://schinagl.priv.at/nt/dupemerge/dupemerge.html
Спасибо за разъяснение.