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


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 1K04 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.
Запросить код