Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wend

In English: wend is an interactive disk usage analyzer for the terminal — a directory tree with shares and sizes next to a sunburst or treemap chart, drawn with character cells. It ships as a single static binary with no dependencies. Full documentation: README.en.md. Note that the application interface itself is currently in Russian only.

English version

Интерактивный анализатор занятого места на диске для терминала.

Сканирует директорию в фоне и сразу показывает дерево с долями и размерами, а справа рисует то же самое кольцевой диаграммой (sunburst) или treemap — без графической оболочки, прямо в терминале.

 /home/user/projects  ·  19.3 GiB  ·  8k элементов
╭──────────────────────────────────────────────╮╭──────────────────────────────────────────────╮
│        доля объект                     размер││projects · 10 в этой папке · 8k всего · [спис…│
│█████   100% ▾ projects               19.3 GiB││  12.4 GiB   64%    4.2k  node_modules/       │
│███▎╌  64.3%   ▸ node_modules         12.4 GiB││   3.5 GiB   18%    1.4k  .git/               │
│▉╌╌╌╌  18.0%   ▸ .git                  3.5 GiB││   1.7 GiB    9%     180  assets/             │
│▍╌╌╌╌   8.7%   ▸ assets                1.7 GiB││   1.3 GiB    6%     320  build/              │
│▍╌╌╌╌   6.5%   ▸ build                 1.3 GiB││ 337.7 MiB    2%     910  vendor/             │
│▏╌╌╌╌   1.7%   ▸ vendor              337.7 MiB││ 118.8 MiB    1%     640  src/                │
│╌╌╌╌╌   0.6%   ▸ src                 118.8 MiB││  24.1 MiB    0%     260  tests/              │
│╌╌╌╌╌   0.1%   ▸ tests                24.1 MiB││  15.2 MiB    0%      74  docs/               │
│╌╌╌╌╌   0.1%   ▸ docs                 15.2 MiB││   1.8 MiB    0%       —  package-lock.json   │
│╌╌╌╌╌   0.0%     package-lock.json     1.8 MiB││  14.2 KiB    0%       —  README.md           │
│╌╌╌╌╌   0.0%     README.md            14.2 KiB││                                              │
╰──────────────────────────────────────────────╯╰──────────────────────────────────────────────╯
 /home/user/projects  ·  19.3 GiB  ·  8k элем.  ·  inode 4718952  ·  ссылок 12  ·  2026-07-26 …
 8k файлов / 8 папок  ·  j/k навигация  h/l свернуть/развернуть  v вид  tab панель  r перескан…

(превью без цвета; в реальном терминале диаграммы и полосы раскрашены)

Возможности

  • Инкрементальный скан. Дерево наполняется по мере обхода — не нужно ждать завершения, чтобы начать смотреть.
  • Четыре режима отображения: список, горизонтальные полосы, кольцевая диаграмма и treemap. Диаграммы рисуются символами с цветным фоном и учитывают, что ячейка терминала вдвое выше своей ширины.
  • Связанные панели. Ветка под курсором в таблице подсвечена на диаграмме, остальное приглушено.
  • Настоящие данные ФС: доля от родителя, число вложенных элементов, время изменения, inode, число жёстких ссылок и реально занятое на диске место.
  • Дедупликация жёстких ссылок по inode — файл, на который ведёт несколько ссылок, считается один раз.
  • Адаптивная вёрстка. Колонки отключаются по мере сужения терминала, ничего не переносится и не разъезжается.

Установка

Бинарь статический и не тянет за собой ничего: ни libc, ни рантайма. Он работает и в дистрибутиве на musl, и в контейнере FROM scratch. Достаточно положить один файл в PATH.

Одной командой

curl -fsSL https://raw.githubusercontent.com/Tinddd28/wend/main/scripts/install.sh | sh

Скрипт определит ОС и архитектуру, скачает последний релиз, сверит контрольную сумму и положит бинарь в /usr/local/bin (при необходимости через sudo).

Полезные переменные:

PREFIX=$HOME/.local/bin sh install.sh   # установить без sudo
VERSION=nightly         sh install.sh   # свежая сборка из main
VERSION=v1.0.0          sh install.sh   # конкретная версия
sh install.sh --dry-run                 # посмотреть, что будет скачано

Если не хочется выполнять скачанный скрипт не глядя — а это разумно — скачайте его отдельно, прочитайте и запустите:

curl -fsSLO https://raw.githubusercontent.com/Tinddd28/wend/main/scripts/install.sh
less install.sh && sh install.sh

Скачать готовый бинарь

На странице Releases рядом с архивами лежат распакованные бинари — их можно скачать и запустить сразу, без распаковки. Имя вида wend_<ос>_<архитектура>, версии в нём намеренно нет: только так работает постоянная ссылка на «последний релиз».

curl -fsSLO https://github.com/Tinddd28/wend/releases/latest/download/wend_linux_amd64
chmod +x wend_linux_amd64
./wend_linux_amd64 ~/Downloads

Скачать архив

Архив втрое меньше и несёт с собой LICENSE и README:

tar -xzf wend_v1.0.0_linux_amd64.tar.gz
sha256sum -c SHA256SUMS --ignore-missing   # SHA256SUMS лежит рядом с архивами
sudo install -m 0755 wend /usr/local/bin/wend

Под Windows архивы в формате .zip, бинарь внутри — wend.exe.

Сборки без ожидания релиза

  • nightly — свежая сборка каждого коммита в main, по постоянным ссылкам вида https://github.com/Tinddd28/wend/releases/download/nightly/wend_linux_amd64. Тег переезжает на каждый коммит, это канал «последняя сборка», а не история версий.
  • Артефакты CI — на странице любого прогона Actions внизу лежат готовые бинари под все шесть платформ, в том числе для пул-реквестов. Хранятся 30 дней, доступны авторизованным пользователям GitHub.

go install

go install github.com/Tinddd28/wend/cmd/wend@latest

Бинарь попадёт в $(go env GOPATH)/bin — убедитесь, что этот каталог есть в PATH.

Из исходников

Требуется Go 1.26.5 или новее (версия зафиксирована в go.mod).

git clone https://github.com/Tinddd28/wend.git
cd wend
go build -o wend ./cmd/wend

Запуск

wend               # текущая директория
wend ~/Downloads   # конкретный путь
wend --version
wend --help

Недоступные из-за прав каталоги пропускаются, обход остального дерева не прерывается.

Управление

Клавиши Действие
j / k, / вверх-вниз
g / G, Home / End в начало / в конец
Ctrl+f / Ctrl+b, PgDn / PgUp страница вниз / вверх
l, , Enter раскрыть директорию, шагнуть внутрь
h, свернуть директорию, подняться к родителю
Tab переключить панель
v сменить режим главной панели
r пересканировать заново
q, Ctrl+c выход

Режимы главной панели

Переключаются по v по кругу:

  1. Список — размер, доля от объёма родителя, число вложенных элементов, имя.
  2. Полосы — то же плюс горизонтальная гистограмма, отмасштабированная по крупнейшему соседу.
  3. Кольца — sunburst: центр показывает суммарный объём, каждое следующее кольцо соответствует уровню вложенности, угол сегмента пропорционален размеру. До пяти колец; тон берётся из углового положения сегмента, поэтому вложенные элементы сохраняют цвет родителя.
  4. Treemap — squarified-раскладка: площадь плитки пропорциональна размеру, до трёх уровней вложенности с подписями.

Как читать цифры

Несколько мест, где wend намеренно расходится с наивным подсчётом:

  • Доля считается от объёма родителя, а не всего дерева, — так она остаётся информативной на любой глубине.
  • Жёсткие ссылки. Файл с nlink > 1 учитывается в суммах один раз, по первой встреченной ссылке. Повторы помечаются , показываются с нулевым вкладом, а их общее число видно в статусбаре. Именно поэтому итог может быть меньше, чем сумма размеров всех файлов.
  • Размер на диске (blocks × 512) показывается в строке деталей, когда расходится с логическим размером больше чем на 10% — это бывает у sparse-файлов и из-за округления до размера блока. На платформах без syscall.Stat_t (Windows) inode, число ссылок и размер на диске недоступны, и дедупликация не выполняется.
  • Символические ссылки не раскрываются: обход по ним не идёт, поэтому цикл через симлинк не может увести скан в бесконечность.

Разработка

go test ./...          # тесты
go test -race ./...    # с детектором гонок: дерево читается из UI
                       # и пишется из горутины сканера
go vet ./...
gofmt -l ./cmd ./internal

Структура:

cmd/wend/              точка входа, разбор аргументов
internal/scan/         обход ФС и потокобезопасное дерево результатов
internal/humanize/     форматирование размеров, счётчиков и дат
internal/tui/          bubbletea-модель, layout, клавиши
  ├── sidebar/         таблица дерева
  ├── mainview/        главная панель и её режимы
  ├── statusbar/       детали выбранного объекта и подсказки
  ├── canvas/          растровый холст из символьных ячеек
  ├── chart/           кольцевая диаграмма и treemap
  └── style/           палитра и обрезка строк по ширине

Сборка и публикация

Три workflow, все на официальных экшенах и gh CLI, без сторонних зависимостей:

Workflow Когда Что делает
ci.yml push в main, пул-реквесты gofmt, go vet, go test -race, сборка под 6 платформ с выгрузкой артефактов
nightly.yml push в main тесты и обновление предрелиза nightly — свежая сборка по постоянной ссылке
release.yml тег v* проверки, тесты, архивы с SHA256SUMS, GitHub Release со списком изменений

Выпустить релиз:

git tag -a v1.0.0 -m "v1.0.0"
git push origin v1.0.0

Теги с дефисом (v1.0.0-rc1) помечаются предрелизными и не подменяют собой «последнюю версию».

Те же артефакты собираются локально, без ожидания CI:

./scripts/build-release.sh v1.0.0   # результат в dist/

Версия Go во всех workflow берётся из go.mod, чтобы CI не разъезжался с проектом. Сборка всегда идёт с CGO_ENABLED=0 и -trimpath — отсюда статический бинарь и воспроизводимость.

Лицензия

MIT

About

Disk usage analyzer that draws real sunburst and treemap charts in your terminal. Single static binary, no dependencies.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages