Почему сравнение по имени и размеру находит не те файлы
Сравнение по имени ошибается в обе стороны. Одно и то же фото, сохранённое дважды, становится IMG_4021.jpg и IMG_4021 (1).jpg — разные имена, идентичные байты, — а два совершенно не связанных документа могут оба называться invoice.pdf. Добавление размера файла снижает число ложных совпадений, но не убирает их полностью: два разных JPEG с одной и той же камеры часто оказываются в пределах нескольких байт друг от друга, а огромное количество мелких конфигурационных файлов совпадает по размеру просто случайно.
Направление, которое действительно важно для безопасности, — это ложное срабатывание: инструмент, называющий два файла дубликатами, когда они лишь похожи, рано или поздно удалит что-то незаменимое. Именно поэтому сопоставление «похожих изображений» заслуживает подозрения в любой автоматизации. Оно по-настоящему полезно для ручной разборки фотобиблиотеки, но серия из десяти почти одинаковых кадров — это десять разных фотографий, а не девять дубликатов, и никакой алгоритм не знает, на каком кадре открыты глаза.
Единственное определение, которое действительно работает, — это побайтовая идентичность. Два файла — дубликаты, если их содержимое идентично, независимо от имени, папки, даты изменения или расширения. Это вопрос, на который отвечает хеш, и отвечает он одинаково каждый раз.
Как работает хеширование содержимого и почему это быстро
Криптографический хеш сводит любой файл к отпечатку фиксированной длины — 64 шестнадцатеричных символа для SHA-256. Идентичное содержимое всегда даёт идентичный отпечаток, и для практических целей два разных файла никогда не совпадут по отпечатку. Поэтому сравнение отпечатков — надёжная замена сравнению целых файлов, и оно позволяет сравнивать тысячи файлов друг с другом сразу, а не попарно.
Хешировать всё подряд означало бы прочитать каждый байт на диске, поэтому грамотная реализация работает поэтапно. Сначала файлы группируются по точному размеру, потому что файлы разного размера не могут быть идентичны, и один этот шаг отсеивает подавляющее большинство кандидатов без чтения содержимого. Затем хешируется только небольшой начальный фрагмент файлов, оставшихся в группах из нескольких файлов. Полный SHA-256 получают только те, кто пережил этот раунд. На типичном диске стадия полного чтения в итоге касается лишь малой доли данных.
Эта поэтапность объясняет, каким должно быть ощущение от сканирования. Первый проход по нескольким сотням тысяч файлов — это в основном работа с метаданными, и он занимает минуты; медленная часть — финальное хеширование крупных видеофайлов, которые действительно совпадают по размеру. Если инструмент занимает часы и упирает диск в потолок, утверждая, что сравнивает по содержимому, он, вероятно, хеширует всё подряд без разбора.
Как сделать это вручную через PowerShell
Для точечной проверки никакой софт не нужен. Следующая однострочная команда группирует файлы по длине, отбрасывает уникальные размеры, хеширует оставшееся алгоритмом SHA-256 и выводит только те группы, где хеш совпал у более чем одного файла. Направьте её на конкретную папку — весь диск тоже сработает, но займёт время.
- Get-ChildItem -Path 'C:\Users\You\Pictures' -Recurse -File | Group-Object Length | Where-Object { $_.Count -gt 1 } | ForEach-Object { $_.Group } | Get-FileHash -Algorithm SHA256 | Group-Object Hash | Where-Object { $_.Count -gt 1 } | ForEach-Object { $_.Group.Path }
- Добавьте -Filter '*.jpg' к Get-ChildItem, чтобы ограничить проверку одним типом файлов
- Добавьте | Out-File C:\Temp\dupes.txt в конце, чтобы сохранить список для проверки
- Запускайте в Windows Terminal или PowerShell; для своих папок права администратора не нужны
- Используйте Get-FileHash -Algorithm SHA1, если хешируете очень большую видеотеку и хотите ускорить процесс
Прочитайте результат, прежде чем что-то удалять
Команда выше намеренно только выводит пути и ничего не удаляет. Это разделение и есть вся модель безопасности: сначала список, потом чтение, потом действие. Отсортируйте вывод по папкам, и обычно закономерность видна сразу — папка импорта с камеры продублирована в папку резервной копии с датой, проект экспортирован дважды, музыкальная библиотека существует и в «Музыке», и в старой копии с внешнего диска, вставленной на C:.
Когда действительно удаляете — удаляйте в корзину, а не навсегда, и делайте это небольшими партиями, с паузой на обычную работу за компьютером между ними. Типичный сбой при чистке дубликатов — это никогда не один неверный файл; это уверенный массовый выбор по папкам, связь между которыми вы не поняли до конца. Если в цепочке остаётся корзина, дорогая ошибка превращается в неудобство.
Где дубликаты реально накапливаются
Настоящие дубликаты концентрируются в считанных предсказуемых местах, и сканировать только их быстрее и намного безопаснее, чем сканировать весь диск C:. Чемпион — «Загрузки»: один и тот же установщик или PDF, скачанный три раза, каждый раз с номерным суффиксом. На втором месте — папки с фото, обычно потому что импорт с телефона запускали два раза или карту копировали и до, и после переименования.
- «Загрузки» — повторные скачивания с суффиксами (1), (2)
- «Изображения» и папки импорта с телефона — импорт запускали не один раз
- Облачные папки — конфликтующие копии OneDrive и Dropbox с добавленным именем устройства
- «Рабочий стол» и папки «старый рабочий стол», оставшиеся после переустановки Windows
- Папки медиа мессенджеров — одно и то же изображение, сохранённое из нескольких чатов
- Папки экспорта проектов — рендеры и сборки, экспортированные повторно
- Старый внешний диск, целиком скопированный в папку на C:
Что нельзя дедуплицировать никогда
Повторяющееся содержимое внутри установок программ — это нормально и сделано намеренно. Многие приложения специально кладут одну и ту же библиотеку времени выполнения в несколько папок, чтобы каждое загружало ту версию, с которой его тестировали; удаление одной копии, потому что она совпадает с другой, — это способ получить приложение, которое запускается нормально, а через месяцы отказывает в конкретной функции. Та же логика применима к наборам игровых ресурсов и папкам разработки, где идентичные зависимости встречаются во многих подпапках проектов.
Сама Windows — самый острый край этой темы. C:\Windows\WinSxS полна файлов, которые выглядят продублированными, но на деле — жёсткие ссылки на одни и те же данные на диске, поэтому наивный сканер сообщает о гигабайтах «дубликатов», которые при удалении не освобождают ничего, а обслуживание при этом ломают. Ограничивайте любое сканирование дубликатов своими папками с данными, а инструмент, предлагающий сканировать системные папки, воспринимайте как повод сменить инструмент.
- C:\Windows и всё, что внутри, особенно WinSxS
- C:\Program Files и C:\Program Files (x86)
- %APPDATA% и %LOCALAPPDATA% — состояние приложений и профили
- C:\ProgramData — лицензии и базы данных приложений
- Папки установки игр и каталоги контента лаунчеров
- Папки разработки: node_modules, vendor, виртуальные окружения, результаты сборки
- Всё на диске, которым пользуетесь не только вы
Какую копию оставить и в какие ловушки не попасть
Когда группа подтверждена как идентичная, оставаться должна та копия, в которую вы заглянули бы первой, — обычно это исходная папка, а не резервная копия, копия из «Загрузок» или с «Рабочего стола». Предпочитайте путь с самым коротким и осмысленным именем. Если одна копия лежит в синхронизируемой облачной папке, а другая нет, оставляйте синхронизируемую только если эта папка действительно ваше рабочее место — иначе вы отдаёте единственную копию сервису, чью синхронизацию потом можно случайно сбросить.
Стоит назвать три ловушки. Файлы с жёсткими ссылками выглядят как разные пути, указывающие на одни и те же данные, поэтому удаление одного не освобождает ничего, а второй продолжает работать — безвредно, но сбивает с толку, когда обещанная экономия так и не появляется. Облачные файлы-заглушки под Files On-Demand в OneDrive могут вовсе не быть локально, и их хеширование заставляет скачать всю папку. А файлы внутри папки, которой управляет что-то другое — набор резервных копий, репозиторий, игровая библиотека, — дубликаты только с точки зрения файловой системы; программа, которой они принадлежат, ожидает оба.
Для повторяемой версии этого процесса поиск дубликатов в Kleaner PRO сравнивает по SHA-256, а не по имени, по умолчанию исключает системные папки и папки программ, группирует совпадения с полными путями и позволяет выбрать, какую копию оставить, прежде чем что-либо удаляется. Способ через PowerShell выше делает то же самое для одной папки и подходит, когда нужно проверить только одно место.
Вопросы и ответы
Безопасно ли удалять дубликаты файлов автоматически?
Не в системных папках и папках программ, где идентичные файлы часто сделаны намеренно или являются жёсткими ссылками. В своих документах, фото и загрузках это безопасно, если инструмент сравнивал по хешу содержимого и удаление идёт в корзину.
Могут ли два разных файла иметь одинаковый хеш SHA-256?
В практическом смысле — нет: ни одной коллизии SHA-256 никогда не было получено. Именно поэтому для дедупликации используют хеширование, а не сравнение имён, размеров или дат.
Почему удаление дубликатов освобождает меньше места, чем обещано?
Обычно из-за жёстких ссылок: несколько путей указывают на одну копию данных, поэтому удаление одного пути ничего не освобождает. Облачные файлы-заглушки тоже могут учитываться по полному размеру, хотя локально почти ничего не занимают.
Похожие фото — это то же самое, что фото-дубликаты?
Нет. Сравнение по похожести сравнивает внешний вид, поэтому серия почти одинаковых кадров выглядит как дубликаты, хотя это десять разных фотографий. Используйте его для ручного просмотра, но никогда для массового удаления.
Понятно до покупки: что входит в лицензию
Разовый 30-минутный триал даёт доступ к базовым инструментам. Возможности с меткой PRO остаются закрыты до активации платной лицензии.
Читайте также
Написать нам: [email protected]