Анализ дискового пространства для macOS и честный ответ на вопрос, что можно удалить.
Silt — это ил, осадок: то, что оседает на дне само, без чьего-либо участия. Кэши, продукты сборки, символы устройств, загрузки трёхлетней давности. Silt их находит.
Требуется macOS 14 или новее. Apple Silicon и Intel. Без песочницы, распространяется вне App Store. Лицензия Apache 2.0.
- Карта диска. Squarified treemap любой папки, клик — провалиться внутрь. Размеры считаются так, как их считает сам диск.
- Чистильщики с описанием последствий. Каждое правило говорит, что удаляет, что вернётся само, а что не вернётся. Ничего невосстановимого никогда не отмечено заранее.
- Большие и забытые файлы. Всё крупнее мегабайта, с сортировкой по размеру или по тому, сколько файл никто не открывал.
- Дубликаты по содержимому. Размер, затем сигнатура из начала и конца файла, затем полный хэш — чтобы файлы, случайно совпавшие по размеру, не попали в отчёт как копии.
- Объяснение расхождения. Там, где сумма скана меньше занятого места на томе, Silt показывает разницу и называет её причины, а не прячет её.
swift build && swift test # движок и тесты
Scripts/build-app.sh # собирает Silt.app
open .build/arm64-apple-macosx/debug/Silt.app
swift run silt scan ~ # тот же движок без окна.xcodeproj нет и быть не должно — чистый SwiftPM оставляет проект пригодным для любого
редактора и избавляет от формата файла, который конфликтует при каждом слиянии.
silt прогоняет весь движок без интерфейса — именно так проблема движка остаётся отличимой от
проблемы интерфейса. Она ничего не удаляет.
silt scan / --depth 2 # дерево того, что занимает место
silt largest ~ --count 40 # самые большие файлы, с путями
silt forgotten ~ --days 730 # крупные файлы, не открывавшиеся два года
silt duplicates ~/Documents # одинаковое содержимое, а не одинаковые имена
silt cleaners --verbose # что можно вычистить и чего это будет стоитьРазмеры на диске постоянно расходятся между собой, и почти всегда это не ошибка. Silt по каждому расхождению занимает позицию:
Занятое место, а не логический размер. Файл в 100 байт занимает 4 КБ; сжатый системный бинарник сообщает 2,4 МБ, а занимает 905 КБ. Только занятое место отвечает на вопрос «сколько я получу обратно, если это удалю».
Жёсткие ссылки считаются один раз. Файл с четырьмя именами — это один файл. На полном скане здесь разница составляет 2,8 ГБ.
Точки монтирования не обходятся. Скан загрузочного диска не запишет в него внешний накопитель, образ или примонтированную среду симулятора.
Основание 1000. 1 ГБ = 1 000 000 000 байт, как в Finder и «Об этом Mac».
Сумма скана будет меньше занятого места тома — и это не ошибка. Часть разницы — папки,
которые macOS не даёт прочитать приложению без Full Disk Access; часть — purgeable-место;
часть — локальные снапшоты Time Machine, чьи блоки принадлежат уже удалённым файлам и до
которых обход каталогов не добирается в принципе. Silt показывает разницу отдельной цифрой.
Подробности — в Docs/accounting.md.
Клоны APFS попадают в дубликаты. Копирование файла в Finder не копирует его блоки. Такая пара действительно идентична по содержимому, но удаление одной копии не освободит ничего. Публичного API, отличающего клон от независимой копии, нет — поэтому Silt говорит об этом прямо, а не делает вид.
Два правила, оба намеренные:
Перемещение в Корзину не освобождает место. Корзина — папка на том же томе. Silt пишет об этом каждый раз, вместо того чтобы отрапортовать о гигабайтах, которых пользователь не увидит.
Защита отказывает раньше, чем удаляет. Ничего за пределами домашней папки, ничего в двух уровнях от её корня, ничего из списка каталогов с невосстановимыми данными, ничего доступного через символическую ссылку, ведущую наружу. Путь считается удаляемым, только если пройдены все проверки; всё неожиданное — отказ. Тесты написаны со стороны отказа.
Без него несколько сотен папок — Mail, Messages, Safari, другие пользователи — невидимы, и их содержимое отсутствует во всех суммах. Silt считает такие папки, сообщает их число и предлагает открыть нужную панель настроек.
Учтите: отладочная сборка подписана ad-hoc, поэтому после каждой пересборки система видит другое приложение и разрешение сбрасывается. Это ожидаемо.
Ранняя стадия. Движок покрыт тестами и сверен с du на реальных деревьях; интерфейс не проходил
ничего, кроме использования. Issues и pull requests приветствуются.