Команда Linux для печати структуры каталогов в виде дерева

510

Есть ли какая-нибудь команда linux, которую я могу вызвать из скрипта Bash, который напечатает структуру каталогов в виде дерева, например,

folder1
   a.txt
   b.txt
folder2
   folder3
user243655
источник
7
Просто беги find. Или, find . -not -path '*/\.*'чтобы скрыть файлы и папки, начиная с .. Если вы хотите получить вывод с пробелами, как в вопросе, используйте его с этим скриптом "find prettifier":find . -not -path '*/\.*' | python -c "import sys as s;s.a=[];[setattr(s,'a',list(filter(lambda p: c.startswith(p+'/'),s.a)))or (s.stdout.write(' '*len(s.a)+c[len(s.a[-1])+1 if s.a else 0:])or True) and s.a.append(c[:-1]) for c in s.stdin]"
user
11
Не должны ли такие вопросы переноситься в SuperUser, а не закрываться?
Balmipour
12
я не думаю, что этот вопрос заслуживает того, чтобы его закрыли как "не по теме". Теги кажутся правильными.
Санкет Берде
14
Политика закрытия вопросов без миграции вредна как для стекового потока, так и для человеческого знания в целом. За последние 3 дня все вопросы, с которыми я столкнулся, были закрыты по аналогичным причинам, и больше никаких действий не было. Это означает, что никто не может обновить его, никто не может дать лучший ответ, и это заставляет stackoverflow выглядеть недальновидным или элитарным. Stackoverflow должен учитывать необходимость переноса, когда в теме обнаружены эти условия.
Нет
5
Я согласен с @NickYeates. Я нахожусь здесь в конце сентября 2017 года и все еще нахожу ответы на этот же вопрос. Думайте надолго, когда мы разрабатываем эти вопросы и отвечаем на политику!
Алекс,

Ответы:

774

Это то, что вы ищете дерево ? Это должно быть в большинстве дистрибутивов (возможно, в качестве дополнительной установки).

~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
|   `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
|   |-- dev_snmp6
|   |-- netfilter
|   |-- rpc
|   |   |-- auth.rpcsec.context
|   |   |-- auth.rpcsec.init
|   |   |-- auth.unix.gid
|   |   |-- auth.unix.ip
|   |   |-- nfs4.idtoname
|   |   |-- nfs4.nametoid
|   |   |-- nfsd.export
|   |   `-- nfsd.fh
|   `-- stat
|-- root -> /
`-- task
    `-- 15589
        |-- attr
        |-- cwd -> /proc
        |-- fd
        | `-- 3 -> /proc/15589/task/15589/fd
        |-- fdinfo
        `-- root -> /

27 directories

образец взят с веб-страницы сопровождающего.

Вы можете добавить опцию, -L #где #заменяется число, чтобы указать максимальную глубину рекурсии.

Удалить, -dчтобы отобразить также файлы.

коварный
источник
54
Примечание для любого посетителя, видящего это: удалить, -dчтобы показать файлы также!
Afr
29
Примечание для любого посетителя, увидевшего это: страница руководства содержит список с большим количеством флагов для вас :)
oivvio
43
Для установки на Mac OS X с Homebrew: brew install tree
funfuntime
2
Для установки на Cygwin apt-cyg install tree(при условии, что вы установили apt-cyg)
blockloop
2
Даже Ubuntu 16.04 не поставляется с этим. Использование apt-get install treeустановит его.
Ромео Сьерра
331

Вы можете использовать это:

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

Через несколько секунд будет показано графическое представление текущих подкаталогов без файлов , например /var/cache/:

   .
   |-apache2
   |---mod_cache_disk
   |-apparmor
   |-apt
   |---archives
   |-----partial
   |-apt-xapian-index
   |---index.1
   |-dbconfig-common
   |---backups
   |-debconf

Источник

Суфиан Хассу
источник
7
Если вы хотите, чтобы это было с пробелами, больше похоже на запрошенный OP, то это: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Бен
В любом случае, я могу игнорировать точечные файлы? Например, запретить перечислять содержимое .git?
GMA
@GeorgeMillo см. Мой комментарий
пользователь
32
Не печатает файлы.
Томаш Зато - Восстановить Монику
36
с файлами: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Чтобы добавить решение Хассу к вашему .bashrc, попробуйте:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
источник
6
Остерегайтесь символа новой строки в конце первой строки, если копируете это напрямую
Рахул
2
Хороший псевдоним. Но в конце отсутствует '' (2 одинарных кавычки). Он работает даже без него, но ... если вы захотите добавить еще несколько команд в конце, вы увидите, что литерал не завершен. Так и должно быть alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu
7

Эта команда работает для отображения папок и файлов .

find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"

Пример вывода:

.
 |-trace.pcap
 |-parent
 | |-chdir1
 | | |-file1.txt
 | |-chdir2
 | | |-file2.txt
 | | |-file3.sh
 |-tmp
 | |-json-c-0.11-4.el7_0.x86_64.rpm

Источник: комментарий от @javasheriff здесь . Он погружен в качестве комментария, а публикация его в качестве ответа помогает пользователям легко его обнаружить.

Паван Кумар
источник
для python3 я нашел find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"работу хорошо
patroqueeet
3

Я уточняю вывод ответа @ Hassou с помощью:

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

Это очень похоже на вывод treeсейчас:

.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh

Вы также можете сделать псевдоним этого:

alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''

Кстати, treeне доступно в некоторых средах, таких как MinGW. Так что альтернатива полезна.

Роберт
источник
gitbash на windows не любит последнее выражение, оно говорит, что оно не прекращено
Leos Literak
3

Вы также можете использовать комбинацию команд find и awk для печати дерева каталогов. Для получения подробной информации, пожалуйста, обратитесь к разделу « Как напечатать многоуровневую структуру каталогов с использованием комбинированных команд linux find и awk »

find . -type d | awk -F'/' '{ 
depth=3;
offset=2;
str="|  ";
path="";
if(NF >= 2 && NF < depth + offset) {
    while(offset < NF) {
        path = path "|  ";
        offset ++;
    }
    print path "|-- "$NF;
}}'
ylspirit
источник