Утилита ls честно отработала десятки лет, но её вывод придуман в эпоху, когда терминал не умел ни цвета, ни графики: столбец имён, флаги из одиночных букв, размеры в сырых байтах, которые приходится пересчитывать в голове. Преемница с коротким именем eza сохраняет привычную механику обзора каталогов и добавляет то, чего классике всегда не хватало: тонкую цветовую разметку по типам файлов, читаемые размеры, дерево каталогов одной командой и, самое любопытное, подсказки о состоянии хранилища версий прямо в списке. Ниже разбор установки, режимов вывода, сортировок, механики колонки со статусом git и честных границ замены.
Установка из репозиториев и три формы вывода на выбор
Проект вырос из утилиты exa, разработка которой остановилась, и продолжил развитие под новым именем силами сообщества. Пакет присутствует в репозиториях Debian, Ubuntu, Fedora, Arch, Alpine, openSUSE и других популярных систем, ставится одной командой и не тянет за собой ворох зависимостей:
apt install eza
dnf install eza
pacman -S eza
Пользователям Rust доступна установка командой cargo install eza. Первый запуск без аргументов даёт сетку имён с цветовой разметкой, и это умолчание: каталоги, исполняемые файлы, ссылки и архивы отличаются оттенками, глазу не нужно всматриваться. Ключ -l превращает сетку в таблицу с правами, владельцем, размером и датой изменения, а -h навешивает сверху шапку с названиями колонок. Третья форма, одна запись в строке, включается ключом -1 и годится, когда список уходит в конвейер:
eza -l --header --group-directories-first
eza -la --header
eza -1
Короткие буквы во многом совпадают с классикой: -l, -a, -r, -R, -F, -d работают предсказуемо, и переезд с ls обходится без переучивания базовой механики. Ключ -a раскрывает скрытые файлы, а повторное его указание добирает и служебные ссылки на текущий с родительским каталогом. Ключ -x раскладывает сетку горизонтально, -F добавляет привычные значки классификации вроде слэша у каталогов и звёздочки у исполняемых. В одной точке привычка подводит: в классике суффикс -h после -l включает читаемые размеры, а здесь размеры в таблице сокращённые по умолчанию, и короткая буква отдана шапке.
Цвета по типам файлов, значки и размеры без пересчёта в уме
Цветовая разметка информативнее классической: типы записей различаются оттенками, а цветом подсвечивается и отношение текущего пользователя к записи, владелец он или из группы владельца. Переменные окружения LS_COLORS и EZA_COLORS уважаются, поэтому накопленные за годы схемы переезжают почти без потерь. Стандартная переменная NO_COLOR поддерживается, а ключ --color=never закрепляет монохромность явно для конвейеров.
Ключ --icons добавляет к именам значки: папка, документ, шестерёнка у настроек, фирменный знак у служебных каталогов хранилища версий. Значки берутся из расширенного шрифта, и без его установки в терминале вместо картинок появятся пустые квадраты, поэтому первым делом шрифт подключается в профиле терминала. Зазор между значком и именем подбирается переменной EZA_ICON_SPACING под конкретный терминал.
Размеры в длинном режиме выводятся сокращёнными ступенями по умолчанию, и файл в четыре тысячи байт выглядит как 4.0K, а не как сырые 4096. Умолчальная шкала десятичная, ключ -b переключает её на двоичные префиксы для сверки с классическими утилитами, а -B возвращает сырые байты. Ключ --total-size выводит фактический объём каталогов, для чего утилита обходит вложенные деревья, и на больших объёмах операция упирается в диск. Подсветка --color-scale=size красит колонку размеров по величине, режим градиента красит плавным переходом, и тяжёлые записи цепляют взгляд раньше цифр. Ключ -o печатает рядом с символьной записью прав и восьмеричное число вроде 644, что удобно при планировании chmod.
Дерево каталогов с ограничением глубины и фильтром игнорируемых файлов
Режим --tree выводит структуру с отступами, а ключ --level ограничивает спуск на заданную глубину:
eza --tree --level=2
eza -l --tree --level=2 --git-ignore
Пара ключей закрывает разведку незнакомого проекта: двух уровней достаточно, чтобы понять устройство, а экран не заполняется сотнями строк. С ключом -l дерево остаётся таблицей: у каждой записи видны права, размер и дата, и обзор структуры совмещается с ревизией атрибутов в одном проходе. Отдельная классическая утилита для деревьев делает похожую работу, но связка таблицы, цвета и фильтров в одной команде удобнее.
В проекте с хранилищем версий дерево стоит фильтровать от результатов сборки и каталогов зависимостей, и ключ --git-ignore делает именно это: записи из правил игнорирования не выводятся. На живом проекте это разница между тремя десятками строк и тремя тысячами, и без фильтра режим --tree в каталоге разработки почти бесполезен.
Ограничение глубины остаётся главным предохранителем: на дереве вроде /usr без ограничения вывод уходит в тысячи строк, и --level ставится в пару к --tree всегда. Практика простая: разведка начинается с уровня 1 или 2, глубина добавляется только там, где структура действительно интересна. Полный рекурсивный режим -R без отступов существует, но читается тяжелее дерева.
Сортировка по размеру и времени в ежедневной ревизии каталогов
Сортировки задаются словами через --sort, и это читается лучше, чем одиночные буквы классики. Поля знакомы: name, size, modified, changed, accessed, created, extension, inode, type. Ключ --reverse переворачивает порядок, у поля modified есть разговорные псевдонимы newest и age, а --group-directories-first ставит каталоги перед файлами:
eza -l --sort=size --reverse
eza -l --sort=modified --reverse
eza --oneline --reverse --sort=size
Первая строка отвечает на вопрос о том, что занимает место, вторая выводит наверх свежие правки, третья даёт плоский список для конвейера. Сортировка по размеру работает по записям каталога мгновенно, а добавка --total-size поднимает наверх и тяжёлые поддеревья, хотя для этого утилита обязана их обойти, и на больших каталогах цена вопроса растёт с числом файлов. Фильтры -D и -f оставляют в выводе только каталоги или только файлы, а --ignore-glob отбрасывает имена по маскам через вертикальную линию.
Временные поля переключаются по-человечески: modified опирается на время изменения содержимого, changed на время правки метаданных, created на время создания, если файловая система его хранит. Ключ --time-style=long-iso печатает метки в плотном формате, удобном для сравнения, а вариант relative показывает возраст записи как расстояние во времени. Для мгновенного ответа на огромных каталогах есть поле none: записи остаются в порядке хранения каталога, без затрат на упорядочивание.
Подсказки состояния хранилища версий прямо в таблице файлов
Главное отличие от классики живёт в длинном режиме. Ключ --git добавляет к таблице двухсимвольную колонку состояния: первая позиция описывает подготовленные к фиксации изменения, вторая говорит о правках в рабочем дереве. Символы лаконичны: линия у неизменённого, N у нового, M у изменённого, D у удалённого, R у переименованного. Каталог получает статус по содержимому, и папка с новыми файлами сама помечается буквой N:
eza -l --git --header
eza --tree --level=2 --git
eza -l --git-repos
Режим --git-repos выводит состояние для самих каталогов хранилища: рядом с именем появляется текущая ветка и отметка чистоты, вертикальная линия для чистого дерева и плюс при незавершённых правках. Для обзора набора проектов одной командой видно, где какая ветка и где остались незаконченные дела. Лёгкая форма --git-repos-no-status не вычисляет состояние и потому дешевле по времени, когда каталогов в выводе много.
Обратный ключ --no-git убирает колонку, и он полезен на огромных рабочих деревьях, где вычисление статусов для тысяч записей ощутимо тратит время. Ключ --git-ignore скрывает игнорируемые записи и в плоском списке, и в дереве. За пределами хранилища колонка не появляется, и вывод в чужих каталогах не ломается.
Границы подсказки честны: колонка отвечает на вопрос, что менялось, но не заменяет полноценный отчёт о состоянии. Разности с внешней копией, история фиксаций и подготовка изменений остаются за штатными командами git, eza лишь убирает лишний вызов из ежедневного цикла.
Рабочие сценарии от навигации по проекту до чистки переполненного раздела
Сценарий первый и самый частый: навигация по проекту. Одна команда показывает содержимое каталога, статус каждой записи и текущую ветку, и после перехода между ветками глазами видно, какие файлы остались изменёнными, какие новые, а какие чисты. Решение о следующем шаге принимается без переключения между двумя утилитами, и экономия не в секундах, а в целостности внимания.
Сценарий второй: ревизия содержимого на сервере. Сортировка по размеру с обратным порядком выкапывает тяжёлые журналы и забытые архивы, сортировка по времени показывает, что трогали последним, дерево с глубиной один даёт структуру незнакомого места. Для составления плана чистки переполненного раздела этих трёх команд обычно хватает, и план собирается, не покидая терминала.
Сценарий третий: интерактивная замена классики с её сохранением для скриптов. Пальцы переезжают на новые команды, а скриптам остаётся классика, и об этом ниже. Карманный набор, закрывающий будни администратора и разработчика, выглядит так:
- eza для быстрого взгляда цветной сеткой;
- eza -l --git --header для таблицы со статусом хранилища;
- eza --tree --level=2 --git-ignore для разведки структуры проекта;
- eza -l --sort=size --reverse --total-size для поиска тяжёлых мест;
- eza -l --sort=modified --reverse для ревизии свежих правок;
- eza -la --icons --header для полного обзора со скрытыми файлами.
Набор стоит прожить неделю сознательно, и рука сама начнёт набирать нужную форму под задачу. Возврат к монохромному столбцу имён после этого ощущается как работа в перчатках.
Границы замены и место классики в скриптах
Скриптам нужен контракт, а не красота. Вывод ls стабилен десятилетиями, на него написаны тысячи разборов в чужих скриптах, и он есть везде, от спасательных носителей до минимальных образов контейнеров. Вывод eza развивается: колонки добавляются, форматы уточняются от выпуска к выпуску, и разбор таблицы в скрипте сегодня превращается в загадку после обновления. Для самой утилиты есть переменная EZA_STRICT, включающая строгий контроль несовместимых ключей и рассчитанная на автоматизацию, но стабильность формата она не гарантирует. Правило простое: интерактивно работает eza, в скриптах остаётся классика или прямое чтение метаданных через stat.
Псевдонимы аккуратно разделяют миры. В файле настроек оболочки, будь то ~/.bashrc или ~/.zshrc, живут короткие имена:
alias ll="eza -l --git --icons"
alias lt="eza --tree --level=2 --git-ignore"
alias lsz="eza -l --sort=size --reverse"
Псевдоним действует только в интерактивной оболочке, скрипты вызывают настоящие бинарники, и подмена классики для глаз не ломает автоматизацию. Затенять само имя ls на своей машине можно, но привычка формируется одна, а на чужом сервере новых команд не окажется, и пальцы будут искать то, чего нет. Наименее болезненный путь держать новые команды под новыми короткими именами и не переучивать классику.
Набор любимых ключей фиксируется в конфигурационном каталоге ~/.config/eza, где живут и файлы тем: однажды собранная форма вызова закрепляется как умолчание, и вызов без аргументов сразу выглядит как привычная команда. Темы цветов приводят палитру команды к общему виду, и новичок с первого дня видит каталоги в тех же оттенках, что и остальные.
Портативность остаётся главным ограничением: на минимальных системах и спасательных носителях новой утилиты нет, и рассчитывать на неё в автоматизации нельзя. Вес пакета скромен, установка тривиальна, и на собственной рабочей машине это не аргумент, но парк машин шире одной рабочей, и классика останется в скриптах ещё долго.
Итоговое суждение спокойное. Новая утилита не отменяет классику, а забирает у неё ежедневный осмотр каталогов, и граница проходит по роду работы: глаза уходят к цветной таблице со статусом хранилища, скрипты остаются на стабильном выводе. Именно колонка со статусом делает переезд необратимым: однажды увидев состояние ветки и метки изменённых файлов прямо в списке, возвращаться к голому столбцу имён уже не хочется. Это самый честный аргумент поставить пакет прямо сегодня.