linux nav

tree

Визуальное дерево директорий и файлов с отступами

Описание

tree — утилита для рекурсивного отображения структуры директорий в виде дерева с отступами и символами псевдографики. В отличие от ls -R, вывод tree визуально передаёт вложенность: каждый уровень отступает, ветки соединяются символами ├──, └──, . Утилита разработана Стивом Бейкером и распространяется как свободное ПО.

На большинстве дистрибутивов tree не входит в базовую поставку и устанавливается отдельно: apt install tree (Debian/Ubuntu), dnf install tree (Fedora/RHEL), brew install tree (macOS). Утилита поддерживает вывод в форматах JSON и XML — это делает её полезной не только для визуализации, но и для обработки структуры в скриптах.

Основные сценарии применения: быстрый обзор структуры нового проекта, документирование файловой иерархии в README, отладка вложенности при работе с файловыми операциями, проверка результатов скриптов, которые создают дерево файлов. В документации по проектам часто можно увидеть вывод именно команды tree.

Синтаксис

tree [ОПЦИИ] [ДИРЕКТОРИЯ...]

Компоненты команды:

tree # дерево текущей директории tree /etc # конкретная директория tree -L 2 # максимальная глубина 2 уровня tree -a # включая скрытые файлы tree -d # только директории tree --gitignore # исключить файлы по .gitignore # Пример вывода: # . # ├── README.md # ├── src/ # │ ├── main.py # │ └── utils.py # └── tests/ # └── test_main.py # 2 directories, 3 files

Флаги и опции

Флаг Описание
-L N Ограничить глубину рекурсии N уровнями (depth limit)
-a Показывать скрытые файлы (начинающиеся с .)
-d Показывать только директории, без файлов
-f Показывать полные пути к файлам (full path prefix)
-I PATTERN Исключить файлы/директории, соответствующие glob-паттерну (можно повторять)
-P PATTERN Показывать только файлы/директории, соответствующие паттерну
-h Человекочитаемые размеры файлов (K, M, G) — используется с -s
-s Показывать размер каждого файла
-D Показывать дату последнего изменения файла
-p Показывать права доступа (permissions) в формате drwxr-xr-x
-u Показывать имя владельца файла (user)
--dirsfirst Сначала выводить директории, затем файлы на каждом уровне
-J Вывод в формате JSON (удобно для обработки в скриптах)
-X Вывод в формате XML
-o FILE Записать вывод в файл (вместо stdout)
--gitignore Читать .gitignore и исключать указанные там файлы (tree 2.0+)
--noreport Не выводить строку итога «N directories, M files» в конце
--charset X Использовать указанную кодировку для символов дерева (например ASCII)

Паттерны использования

Быстрый обзор структуры проекта

Посмотреть 2 уровня вложенности — не слишком много, но полная картина.

tree -L 2
# .
# ├── docs/
# │   ├── api.md
# │   └── setup.md
# ├── src/
# │   ├── app.py
# │   └── models/
# └── tests/
# 3 directories, 3 files

Только директории (скелет проекта)

Удобно при документировании архитектуры.

tree -d -L 3
# .
# ├── docs
# ├── src
# │   ├── api
# │   ├── models
# │   └── utils
# └── tests
#     └── fixtures

Исключить служебные директории

Убрать node_modules, .git, __pycache__ из вывода.

tree -I "node_modules|.git|__pycache__|*.pyc"
tree -I "node_modules" -I ".git" -I "*.egg-info"

# Или использовать .gitignore:
tree --gitignore

Документирование в README

Вставить структуру проекта прямо в README.md.

# Сгенерировать и скопировать:
tree -L 2 --dirsfirst -I ".git"

# Или записать в файл:
tree -L 3 -o docs/structure.txt

# Для README (ASCII-совместимый):
tree --charset ASCII -L 2

Найти файлы по паттерну

Показать только файлы определённого типа во всём дереве.

tree -P "*.py"           # только .py файлы
tree -P "*.html" -L 4   # html на глубине до 4
tree -P "test_*"        # файлы начиная с test_

# Вместе с размерами:
tree -P "*.log" -sh

Вывод в JSON для обработки

Структура дерева в формате, удобном для парсинга.

tree -J -L 2 | python3 -m json.tool
# Или сохранить:
tree -J -L 3 -o structure.json

# Подсчитать количество файлов по типу:
tree -J | python3 -c "
import json, sys
data = json.load(sys.stdin)
# ... обработка ..."

Советы и предупреждения

tree не установлена по умолчанию — это нормально
На большинстве серверных дистрибутивов tree отсутствует. Быстрая замена через встроенные инструменты: find . -type f | sort или ls -R. Для установки: sudo apt install tree / sudo yum install tree.
Альтернатива: find с форматированием
Если tree недоступна, псевдодерево можно получить через: find . | sed -e 's/[^/]*\// /g' -e 's/ \([^/]\)/└─ \1/' Или использовать exa --tree (современная замена ls с поддержкой дерева).
Осторожно с большими деревьями без -L
Вызов tree / или tree в большом проекте с node_modules без ограничения глубины -L выведет миллионы строк и может зависнуть терминал. Всегда используйте -L N при работе с незнакомыми директориями или большими проектами.
Флаг --gitignore появился в tree 2.0
На старых системах (Ubuntu 20.04 и раньше) установлена tree 1.8, где --gitignore отсутствует. Проверьте версию: tree --version. При необходимости обновите через snap install tree или соберите из исходников.