Программы
Как получить дерево директорий на Bash одним однострочником

Как получить дерево директорий на Bash одним однострочником

Велик и могуч язык Bash! И много в нём возможностей для написания маленьких, но гордых однострочных команд, что могут, например, вывести дерево директорий на Bash одним однострочником.

Сам рецепт на Bash:

ls -R | grep ':$' | sed -e 's/:$//;s/[^─][^\/]*\//──/g;s/^/ /;s/─/├/'

Выводит он для директории мини-мануалов примерно следующее:

 .
 ├─pages
 ├───android
 ├───common
 ├───linux
 ├───osx
 ├───sunos
 ├───windows
 ├─scripts

Замечательно же! Теперь давайте разберёмся, как он это делает. Начнём с ls -R:

$ ls -R
.:
pages  readme.ru  scripts

./pages:
android  common  linux  osx  sunos  windows

./pages/android:
am.md          cmd_ru.md       getprop.md     logcat_ru.md    wm.md
...

./pages/common:
 2to3.md                       jdupes.md
...

./pages/linux:
a2disconf.md             hlint.md                  pvcreate.md
...

./pages/osx:
afinfo.md         eval.md             n.md               spotify.md
...

./pages/sunos:
devfsadm.md     prctl_ru.md    runsvdir.md   svccfg.md     truss.md
...

./pages/windows:
assoc.md            cmd.md          mount.md        rmdir.md
...
./scripts:
untr.py

У утилиты ls есть ключ -R для рекурсивного обхода вложенных папок. Благодаря ему нам на вывод выдаётся столько информации. Теперь самое время эту информацию обработать. А точнее - оставить вывод только папок. Для этого подойдёт grep Тут, к примеру, мы выводим только то, что оканчикается на ":" - то есть директории:

$ ls -R | grep ':$'
.:
./pages:
./pages/android:
./pages/common:
./pages/linux:
./pages/osx:
./pages/sunos:
./pages/windows:
./scripts:

В принципе, это уже то, что мы хотели - вывод директорий, вложенных в данную. Но теперь хочется сделать это красиво. Теперь нам нужен sed!

$ ls -R | grep ':$' | sed -e 's/:$//;'
.
./pages
./pages/android
./pages/common
./pages/linux
./pages/osx
./pages/sunos
./pages/windows
./scripts

Убрали финальное ":", если оно в конце строки и

ls -R | grep ':$' | sed -e 's/:$//;s/[^─][^\/]*\//──/g;s/^/ /;'
 .
 ──pages
 ────android
 ────common
 ────linux
 ────osx
 ────sunos
 ────windows
 ──scripts

заменили символы, которые не и не следующий за ним / - что обычно смена директории "внутрь", на уровень вложенности, а именно - на ──. Далее буквально правило - s/^/ / - "Смотри, если видишь начало, поставь пробел".

И финальный этап:

$ ls -R | grep ':$' | sed -e 's/:$//;s/[^─][^\/]*\//──/g;s/^/ /;s/─/├/'
 .
 ├─pages
 ├───android
 ├───common
 ├───linux
 ├───osx
 ├───sunos
 ├───windows
 ├─scripts

В часности, последняя часть: s/─/├/ - это также sed, как вы поняли, но суть в выставлении для первых найденныйх - чисто для того, чтобы вам было удобно смотреть.

Вот такой простой этот нескучный однострочник!

Также может быть вам интересно:

Take-Two Interactive хочет закрыть RE3

Американская компания Take-Two Interactive, издавшая GTA и многие другие игры, подала иск против RE3 - проекта по написанию форка GTA 3 и Vice City путём реверсинженеринга исходной игры.

Читать »

Что нового в Python 3.10

Вышла новая версия языка программирования Python 3. В ней добавлены новые синтаксические конструкции, улучшения уже имеющихся возможностей.

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Так ли безопасен Linux? Несколько коммитов с уязвимосятми в stable

Исследователи сумели пройти code-review с реквестами в ядро Linux, заведомо содержащими добавление уязвимостей.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django - своя регистрация на сайте

Если вашим сайтом должны активно пользоваться несколько человек, то полезно их различать, а значит - надо уметь создавать пользователей, либо предоставлять возможность регистрации Django пользователей.