Кейс · CLI-утилита · Rust

dupfind: быстрый поиск дубликатов файлов

CLI на Rust для поиска дубликатов файлов. Файлы группируются по размеру, затем по частичному хэшу (первые и последние 4 КиБ) и только потом по полному BLAKE3; обход и хэширование параллельные. По умолчанию программа только показывает результат; удаление, жёсткие ссылки и перенос включаются --apply и перепроверяют хэш перед действием. Жёсткие ссылки одного файла дубликатами не считаются, симлинки не обходятся.

  • Rust
  • BLAKE3
  • rayon
  • proptest
  • CLI
  • GitHub Actions
  • Docker

01 · Как выглядит

Скриншоты

Скриншот проекта «dupfind: быстрый поиск дубликатов файлов» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «dupfind: быстрый поиск дубликатов файлов» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

Задача: найти дубликаты файлов быстро и безопасно: не удалить ничего лишнего и не принять жёсткую ссылку за копию.

Решение: Rust. Группировка по размеру, затем BLAKE3 первых и последних 4 КиБ и только потом полный BLAKE3; обход и хэширование параллельные (rayon). По умолчанию только показывает, действия включает --apply и перед ними хэш пересчитывается.

Ограничения

На Windows вручную не запускался: там проходят сборка, clippy и тесты в CI, тесты жёстких ссылок и симлинков отключены.

Побайтового сравнения нет: надёжность опирается на BLAKE3, перед действием хэш пересчитывается.

Права и расширенные атрибуты заменяемой копии при --hardlink теряются.

Замеры на демо-данных, Docker Desktop, горячий кэш: не бенчмарк.

Что внутри

  • Пути с одинаковым device+inode сворачиваются в один физический файл и дубликатами не считаются; симлинки не открываются и не обходятся, поэтому циклы невозможны
  • Режимы --delete-newer, --hardlink, --move-to, форматы text, json, ndjson, список путей из stdin (в том числе с NUL), --exit-code для CI
  • Демо-каталог 10 000 файлов (307 МБ, треть копии): около 120 мс на 20 потоках (116–133 в трёх прогонах), около 200 мс на одном потоке; find + sha256sum + sort + uniq около 1130 мс
  • Найденная и исправленная ошибка: буфер чтения 256 КиБ выделялся на каждый файл, 20 потоков работали медленнее одного (около 520 мс против 270 мс); теперь один буфер на поток
  • 18 интеграционных тестов на временных каталогах и proptest: группы в точности равны классам одинакового содержимого
  • Релизные бинарники для Windows, Linux и macOS собирает workflow как артефакты

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> dupfind
cd dupfind
cargo build --release
./target/release/dupfind ~/Downloads --exclude '**/node_modules' -m 1K

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.

Запросить код