Как всё связано
- 01getattrlistbulk
- 02Общий стек задач
- 03FileTree
- 04Один обратный проход
- 05Кольца · Плитки
Сканер, заточенный под скорость
Скан ~/projects, 2,06 млн файлов и папок, занимает 6,5 секунды; du -sk тратит на ту же папку 30,7 и приходит к тому же итогу.
getattrlistbulk(2)отдаёт атрибуты целой директории за несколько системных вызовов вместо одногоstatна файл.- Рабочие потоки делят общий стек задач с обходом в глубину и открывают каждую директорию через
openatотносительно родителя. - Дети директории записываются одной пачкой, поэтому лежат рядом и всегда после родителя: подсчёт размеров укладывается в один обратный проход.
- Жёсткие ссылки считаются один раз, точки монтирования пропускаются, так что
/никогда не забредает на внешние диски.
Два миллиона узлов за копейки
Дерево хранится как структура массивов: около 35 байт на узел плюс имена, 117 МБ на два миллиона. Последний скан сохраняется на диск и грузится за 10 мс, так что приложение открывается мгновенно и обновляется в фоне.
Что он находит
- Карта диска: кольца и плитки по заранее посчитанной геометрии; клик по сегменту переносит прямо в папку.
- Умная очистка: кэши Xcode, залежавшиеся
node_modules, ненужные образы Docker, старые симуляторы, кэши и логи приложений, всё за один проход. - Дубликаты: сначала размер, потом частичный хеш, потом полный SHA-256. Клоны APFS распознаются, так что цифра показывает, сколько удаление освободит на самом деле.
- Приложения: каждое приложение со всеми скрытыми данными в
~/Library, чтобы удалить начисто или просто сбросить.
Безопасно по умолчанию
Всё сначала уходит в Корзину, а История 30 дней возвращает файлы на прежние места. Очистка никогда не уходит по симлинку за пределы цели, не пересекает точки монтирования и не трогает ничего, что лежит меньше чем на два уровня внутри домашней папки.
Стек
Swift 6 и SwiftUI с Liquid Glass, движок отдельным пакетом без UI и с тестами, WidgetKit для двух виджетов на рабочий стол, иконка в строке меню. Английский и русский.