Почему стоит использовать exa вместо привычной консольной утилиты ls

Автор оригинала: Sudeshna Sur
  • Перевод

Изображение: Opensource.com

Цель автора статьи — показать, что exa может легко заменить стандартную утилиту ls. И более того, в сравнении с ls, exa — более гибкий и мощный инструмент.

Стараясь сэкономить время и силы, мы автоматизируем часто повторяющиеся и сложные операции. Например, для отслеживания изменений содержимого каталогов и информации о файлах в Linux-системах многие по-прежнему используют команду ls. Но вывод ls по умолчанию [по мнению автора] не совсем приятен для глаз, поэтому приходится выкручиваться. При работе с ls возникает ещё ряд неудобств, но в этой статье мы не будем про них говорить. И вообще, зачем тратить на это время, если есть exa?

Exa — современная и более достойная альтернатива утилите ls. Exa написана на языке Rust, который хорошо зарекомендовал себя из-за высокой скорости работы, повышенной безопасности и качественной реализации параллелизма.

Установка exa


Всё предельно просто:

$ dnf install exa

Возможности exa


По сравнению с ls, exa обладает более широкими возможностями. Благодаря продуманным настройкам по умолчанию она уже на старте выигрывает по функционалу и визуалу. В выводе exa используется своя подсветка для разных типов файлов и метаданных. Она способна распознавать симлинки, расширенные атрибуты и Git-файлы. При этом утилита быстрая, компактная и поставляется с одним единственным бинарником.

Отслеживание изменений содержимого каталогов


Пример: вы можете использовать exa, чтобы узнать информацию о новом файле, добавленном в некий репозиторий Git.

$ exa --long --header --git


Изображение: Sudeshna Sur, CC BY-SA 4.0

Отображение дерева


$ exa --tree --level=2

Параметр level определяет способ отображения листинга с заданным уровнем вложенности каталогов. Если нужно просмотреть больше подкаталогов, то level нужно увеличить.


Изображение: Sudeshna Sur, CC BY-SA 4.0

А на примере этого дерева видно, насколько детально можно отображать метаданные о каждом файле.


Изображение: Sudeshna Sur, CC BY-SA 4.0

Цветовые схемы


По умолчанию exa раскрашивает файлы разных типов в соответствии со встроенной цветовой схемой. Схема не только различает файлы и директории в целом, но и присваивает свой цвет каждому из таких файлов, как Cargo.toml, CMakeLists.txt, Gruntfile.coffee, Gruntfile.js, Makefile. Этим список не ограничивается. Полную цветовую схему можно посмотреть на сайте утилиты.

Расширенные атрибуты


Для просмотра расширенных атрибутов нужно добавить в команду ключ --extended:

$ exa --long --extended ‘GettingStartedWithOpencV’

Симлинки


Exa не просто знает, что такое симлинк, она может по симлинку найти и отобразить фактическое местоположение файла.


Изображение: Sudeshna Sur, CC BY-SA 4.0

Рекурсивный обход подкаталогов


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

$ exa --recurse

Что и требовалось доказать


Exa — один из наиболее простых и гибких инструментов. Она позволяет легко работать с большим количеством Git- и Maven-файлов. Подсветка помогает ориентироваться во множестве каталогов и их подкаталогов, а также следить за расширенными атрибутами.

Что вы думаете об утилите exa? Используете её в работе? Или вместо ls и exa пользуетесь чем-то другим?



Дешёвые серверы для любых задач. Используем новейшее железо, лучший дата-центр в Москве уровня надёжности TIER IV, бесплатно предоставляем защиту от DDoS-атак на любом тарифном плане, который можно создать самостоятельно в течение минуты.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Маклауд
Облачные серверы на базе AMD EPYC

Комментарии 42

    +2
    Выглядит чересчур многобуквенно. Нет ли у этой утилиты коротких ключей, желательно, как и у ls, односимвольных?
      0
      Почти для всего есть.
      exa --help
      Usage:
      exa [options] [files...]

      -?, --help show list of command-line options
      -v, --version show version of exa

      DISPLAY OPTIONS
      -1, --oneline display one entry per line
      -l, --long display extended file metadata as a table
      -G, --grid display entries as a grid (default)
      -x, --across sort the grid across, rather than downwards
      -R, --recurse recurse into directories
      -T, --tree recurse into directories as a tree
      -F, --classify display type indicator by file names
      --colo[u]r=WHEN when to use terminal colours (always, auto, never)
      --colo[u]r-scale highlight levels of file sizes distinctly

      FILTERING AND SORTING OPTIONS
      -a, --all show hidden and 'dot' files
      -d, --list-dirs list directories like regular files
      -L, --level DEPTH limit the depth of recursion
      -r, --reverse reverse the sort order
      -s, --sort SORT_FIELD which field to sort by
      --group-directories-first list directories before other files
      -D, --only-dirs list only directories
      -I, --ignore-glob GLOBS glob patterns (pipe-separated) of files to ignore
      --git-ignore Ignore files mentioned in '.gitignore'
      Valid sort fields: name, Name, extension, Extension, size, type,
      modified, accessed, created, inode, and none.
      date, time, old, and new all refer to modified.

      LONG VIEW OPTIONS
      -b, --binary list file sizes with binary prefixes
      -B, --bytes list file sizes in bytes, without any prefixes
      -g, --group list each file's group
      -h, --header add a header row to each column
      -H, --links list each file's number of hard links
      -i, --inode list each file's inode number
      -m, --modified use the modified timestamp field
      -S, --blocks show number of file system blocks
      -t, --time FIELD which timestamp field to list (modified, accessed, created)
      -u, --accessed use the accessed timestamp field
      -U, --created use the created timestamp field
      --time-style how to format timestamps (default, iso, long-iso, full-iso)
      --git list each file's Git status, if tracked or ignored
      -@, --extended list each file's extended attributes and sizes
        –1
        Я просто создал alias c `ls` на `exa` и всякие OhMyZsh и OhMyFish по
        `ll` печатают через exa и запоминать ничего нового не надо.
        +11
        И вообще, зачем тратить на это время, если есть exa?

        Зачем тратить на это время, если есть stat?

        В статье есть несколько удобных примеров для пользователей git (но есть же gitk и IDE), но в остальном — ls просто не забирает хлеб у штатных stat/getfattr/find, поэтому ставить еще одну программу, пока она не вошла в дистрибутив по умолчанию — нет особого смысла. Если мне нужна удобная и красивая навигация, разве не лучше поставить mc?

        Было бы интересны примеры, как exa может заменить stat/getfattr, а примеры из статьи мне показались недостаточно убедительными, например этот:
        Exa не просто знает, что такое симлинк, она может по симлинку найти и отобразить фактическое местоположение файла.


        Так и ls тоже может:
        $ ls -lF /etc/localtime /etc/resolv.conf
        lrwxrwxrwx 1 root root 31 Feb 24 03:01 /etc/localtime -> /usr/share/zoneinfo/Europe/Kiev
        lrwxrwxrwx 1 root root 39 Aug  5  2019 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

          +12
          Зачем тратить на это время

          Затем, что з/п автора поста прямо пропорциональна кол-ву букаф в день.
          Стартапы и блокчейны уже разобрали на сегодня, поэтому переводит первое попавшееся под руку.
          (статью такого же бедолаги на галерах)

            0
            Я прочитал исходную статью на английском.
            Оригинальный автор — девушка в Индии: «She is an RHCSA and is working her way to RHCA.»
            Будьте снисходительны.
            Ну, и в оригинале нет такой вычурности, какая появилась при переводе. Про симлинки в оригинале было просто: «Exa understands symlinks and also points out the actual file.»
              0
              Девушек на галерах даже пираты не использовали (на веслах, по крайней мере).
              А тут без зазрения… Вот гады.
            0
            разве не лучше поставить mc

            В mc вымораживает постоянные мусорные символы «OA» и прочие символы вместо ожидаемый функций клавиш когда жмешь Home, End или клавиши курсора, и эти символы потом ещё стирать нужно… кто-нибудь знает как с этим бороться?
              +5
              И в отличие от coreutils, тащить exa в продакшен в приличных компаниях может не получиться, максимум на рабочие станции полутора эстетов.
              +18
              на языке Rust, который хорошо зарекомендовал себя из-за высокой скорости работы, повышенной безопасности и качественной реализации параллелизма

              Охренеть насколько важные параметры при разработке утилиты, рисующей в терминале список файлов.


              Дерево прекрасно рисуется командой tree, симлинки вполне себе показывает и ls на дебиане почти что десятилетней давности. Разве что с гитом затык и выхлоп git status не настолько же читабелен. О чём кино-то?

                –1

                Для ls это может быть и не так важно, но вот если взять какой-нибудь grep в рекурсивном режиме — он будет делать это в один поток.
                К сожалению, на с/с++ так и не осилили добавить в grep многопоточность, хотя есть варианты с костылями.


                А на расте многопоточность делается легко и безопасно, собственно поэтому и пишут


                на языке Rust, который хорошо зарекомендовал себя из-за высокой скорости работы, повышенной безопасности и качественной реализации параллелизма
                  0
                  но вот если взять какой-нибудь grep в рекурсивном режиме — он будет делать это в один поток.

                  А что умеет делать еxa из того, что умеет делать grep?
                  –1
                  на языке Rust, который хорошо зарекомендовал себя из-за высокой скорости работы, повышенной безопасности и качественной реализации параллелизма
                  Охренеть насколько важные параметры при разработке утилиты, рисующей в терминале список файлов.

                  Думаю, это примерно как пишут "ИГИЛ". Если это не институт гидродинамики им. М.А.Лавреньтева, то правильно должно быть "ИГИЛ*" с пометкой "запрещённая организация".
                  Так и тут, к любому упоминанию RUST приписывается список всех его известных свистелок (иначе никто же не оценит!)

                  +11
                  Так и не понял — всё-таки почему нужно использовать exa вместо ls? Какие доводы то? Цветное и ls показывает. Не увидел нового функционала.
                  на языке Rust, который хорошо зарекомендовал себя из-за высокой скорости работы,

                  При этом, exa гораздо медленнее работает, особенно с сортировками.
                  Дак в чем прикол то?
                  Или это первое апреля?
                    0

                    Ну как, если кто помнит все ключи ls наизусть, но гибкости всё равно не хватает — тогда можно поставить exe.

                    +3
                    Но вывод ls по умолчанию [по мнению автора] не совсем приятен для глаз, поэтому приходится выкручиваться.

                    Вывод по умолчанию у обоих утилит абсолютно одинаков, лишь цветовые схемы чуток различаются
                      +7
                      При этом утилита быстрая, компактная и поставляется с одним единственным бинарником

                      ну давайте проверим, какая она компактная


                      $ du -h $(which exa) $(which ls)
                      1.4M    /usr/bin/exa
                      140K    /usr/bin/ls

                      как-то не впечатляет. Когда добавление пары незначительных функций приводит к увеличению бинарника в 10 раз, это говорит о мягко говоря не самом лучшем качестве кода (хотя чего еще ждать от проекта на расте)

                        +1
                        хотя чего еще ждать от проекта на расте

                        А ведь так хорошо комментарий без этой приписки читался… У вас есть какие-то сведения о среднем низком качестве кода в проектах на расте?

                          +3

                          Абсолютно согласен. Даже, если по аналогии сравнивать top и htop (они так же параллельны как ls и exa)


                          $ du -h $(which top) $(which htop)
                          108K    /usr/bin/top
                          184K    /usr/bin/htop

                          то htop — отличная альтернатива. Функционала больше и размер соответствующий. Но у exa размер x10, а польза +20%.


                          Автору спасибо, но нет.


                          P.S. В инете везде пишут, что раст заменит С в будущем как системный язык, но если он генерит в 10 раз жирнее код, то пойдука я мимо.

                            +3

                            Он не код жирнее генерит, он просто линкуется статически.

                              0
                              Для шелл команды, которая в любой момент может стать частью скрипта, простые утилиты адекватного размера это перфоманс
                                0

                                статический или динамический жир… какая разница? не нативные либы в системе тоже можно назвать жиром. Плюс, ls работает в разы быстрее. Это разве не говорит о качестве?

                                  0

                                  Разница в том, что с ростом объёма кода объём "жира" не увеличивается.

                                    0

                                    это актуально для огромных программ с зашкаливающим функционалом, а для маленьких утилит, как ls, это балласт. Пусть автор продолжает писать монстров, а утилиты пусть остаются нормального размера.

                                    0

                                    Тут такое дело...


                                    $ ldd `which ls`
                                            linux-vdso.so.1 (0x00007fff689b3000)
                                            libc.so.6 => /lib64/libc.so.6 (0x00007f056e780000)
                                            /lib64/ld-linux-x86-64.so.2 (0x00007f056e978000)

                                    у ls жира нет ВООБЩЕ, она использует только libc. Сколько и какого жира rust положил в мегабайтный экзешник? Он точно там нужен?

                                      0
                                      Зависимости
                                      [dependencies]
                                      ansi_term = "0.12"
                                      datetime = "0.5"
                                      glob = "0.3"
                                      lazy_static = "1.3"
                                      libc = "0.2"
                                      locale = "0.2"
                                      log = "0.4"
                                      natord = "1.0"
                                      num_cpus = "1.10"
                                      number_prefix = "0.4"
                                      scoped_threadpool = "0.1"
                                      term_grid = "0.1"
                                      term_size = "0.3"
                                      unicode-width = "0.1"
                                      users = "0.11"
                                      zoneinfo_compiled = "0.5"
                                0
                                Компактнее в 1/10 раза :-D По первоапрельски прям.
                                  +2
                                  Так, статья и есть первоапрельская шутка. Я на словах
                                  Установка exa
                                  Всё предельно просто:
                                  $ dnf install exa
                                  чуть чаем не подавился.
                                  Автор статьи превентивно считает, что у всех стоит «шляпный» дистрибутив.

                                  EDIT: Претензия снимается, посмотрел оригинал статьи, там написано «Sudeshna Sur (Red Hat, Correspondent)». Вопросы отпадают.
                                +7
                                Есть ещё замечательная lsd. Тоже написана на Rust. Сравнительный анализ c exa я не проводил, но лично мне хватает возможностей, +можно кастомизировать через конфиг.
                                image
                                  +11
                                  Раскраска в духе названия :)
                                    0
                                    А что у тебя за оболочка?
                                      0
                                      Скрин с оф. сайта утилиты. У меня связка zsh+zsh-syntax-highlighting+zsh-autosuggestions+zsh-completions. Для lsd требуются шрифты с глифами (nerd font, font awesome в помощь). А вообще конкретно lsd пофигу, где работать :)
                                      P.S.: Свой скрин могу позже скинуть, сейчас не за компом.
                                    +1
                                    Пока она не будет по-умолчанию установлена в большинстве дистрибутивов — смысла нет. Переучиваться только затем, чтобы сев на другую машину вводить привычную команду, материться и всё равно набирать ls? Спасибо, увольте.
                                      +3
                                      Думаю не хватает одного полезного тега с сегодняшней датой. Тогда бы я похвалил за изящность троллинга.
                                        +1
                                        Благодаря продуманным настройкам по умолчанию она уже на старте выигрывает по функционалу и визуалу.

                                        Синий текст на черном фоне — плохо, Тёмно-синий текст на черном фоне — это уже форменное издевательство над глазами. О какой продуманности идет речь?
                                          0

                                          Да все цвета в терминале – издевательство, хотя бы потому что не все ставят черный цвет на бэкграунд. У меня, например, и темно-красный, и синий, и серый, и черный для разных серверов/задач. В iTerm есть настройка "минимальный контраст", только это и спасает.

                                          +1
                                          ls -la
                                            +1

                                            alias ll='ls -alF' — по дефолту в убунте стоит.

                                              0
                                              тоже хотел написать, в большинстве случаев только этим и пользуюсь, а алиасы бывает влом прописывать в каждом новом дистрибутиве.

                                              в новых дистрах и так боль была отказаться от ifconfig, хотя ip и ss мне со временем понравились.
                                              0
                                              разные цвета для разных форматов файлов в выводе ls легко и непринужденно кастомизируются (переменная LS_COLOR), + подчеркивания, жирность, мигания, и может еще чтото забыл. где бенчмарки что exa быстрее?
                                                0
                                                А что такое dnf?
                                                  0

                                                  Это в Федорином горе такой пакетный руководитель. То же, что и apt в debian.

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое