xdu: визуализация взвешенных деревьев

2011-11-17

Недавно я искал утилиту для визуализации занятого места в файловой системе и нашёл замечательную программу xdu. Так выглядит её интерфейс:

Интерфейс xdu

Можно перемещаться между каталогами (зумиться и возвращаться назад) при помощи кликов на прямоугольниках.

xdu решает задачу просмотра занятого места в духе Unix. Поскольку уже есть программа, которая собирает информацию о занятом месте на диске (утилита du), то требуется лишь визуализировать собранные этой программой данные. Пример выходных данных du:

25      /var
15      /var/lib
14      /var/lib/pacman
12      /var/lib/pacman/local
11      /var/cache
6       /var/cache/pacman/pkg
6       /var/cache/pacman

То есть строчки с числом-размером каталога и его названием, где каталоги разделены слэшами. Размер отделяется от названия табуляцией.

xdu читает данные в этом формате, но знает лишь то, что здесь представлено взвешенное дерево. Число в строке — вес ветки дерева, а название — это иерархический путь до этой ветки.

Таким образом, с помощью xdu можно визуализировать любые взвешенные деревья, достаточно представить их в таком формате. Более того, писать программу вычисления дерева можно на любом языке, поскольку визуализатор просто принимает данные со стандартного ввода. Вот как, например, выглядит типичное использование xdu для просмотра занятого места в ФС:

$ du -xm / | xdu -n

Несколько слов о коде программы xdu. Её написал Phillip Dykstra в 1991 году. Последняя версия 3.0 была выпущена в 1994 году. Программа написана на языке C и использует библиотеку X11 Athena Widgets. Для сборки используется imake проекта X11 для генерации Makefiles. В принципе можно собрать её и вручную, указав библиотеки в опциях компилятора. xdu занимает 1300 строк кода:

$ wc -l *.c *.h
  770 xdu.c
  496 xwin.c
    1 patchlevel.h
    1 version.h
 1268 total

Программа отлично собирается на текущей версии Arch Linux (она есть в AUR) несмотря на свой 20-летний возраст. Некоторые проблемы, связанные с её возрастом, заключаются в том, что она не понимает не-ASCII символов и пробелов в именах веток дерева. В остальном же её можно использовать и по сей день. Я выложил xdu на GitHub на всякий случай.