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


510

Чи є якась команда linux, яку я можу викликати зі сценарію Bash, який буде друкувати структуру каталогу у вигляді дерева, наприклад,

folder1
   a.txt
   b.txt
folder2
   folder3

7
Просто біжи find. Або find . -not -path '*/\.*'приховати файли та папки, починаючи з .. Якщо ви хочете мати вихід із пробілами, як у запитанні, використовуйте його з цим сценарієм "знайти добрівець":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]"
користувач

11
Чи не повинні такі питання мігрувати до SuperUser, а не закриватися?
Бальміпур

12
Я не думаю, що це питання заслуговує на те, щоб закрити його як "поза темою". Теги здаються правильними.
Санкет Берде

14
Політика закриття питань без міграції шкідлива як для стаціонарного потоку, так і для людських знань загалом. Протягом останніх 3 днів кожне запитання, з яким я гугл і натрапив, було закрите для подібних міркувань, і більше жодної активності не вдалося зробити. Це означає, що ніхто не може її оновити, ніхто не може дати кращої відповіді, і це робить stackoverflow вигляд короткозорим або елітарним. Stackoverflow повинен розглянути питання про необхідність міграції, коли для теми є такі умови.
Най

5
Я погоджуюся з @NickYeates Я тут наприкінці вересня 2017 року, але все ще знаходжу відповіді на це саме питання. Думайте довгостроково, коли ми розроблятимемо ці політичні запитання та відповіді!
Алекс

Відповіді:


773

Це те, що ти шукаєш дерево ? Це має бути в більшості дистрибутивів (можливо, як додаткова установка).

~> 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

42
Щоб встановити на Mac OS X w / 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
Якщо ви хочете, щоб це було з пробілами, на зразок запитуваної ОП, то це: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben

будь-яким способом я можу зробити це ігнорувати дотфайли? Наприклад, завадити йому перерахувати вміст .git?
GMA

@GeorgeMillo дивіться мій коментар
користувач

32

36
з файлами: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff

18

Щоб додати рішення Hassou до свого .bashrc, спробуйте:

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

6
Остерігайтеся символу нового рядка в кінці першого рядка, якщо скопіювати це безпосередньо
Рахул

2
Гарний псевдонім. Але в кінці не вистачає '' (2 одиничні цитати). Він працює навіть без нього, але ... якщо ви хочете додати ще кілька команд наприкінці, ви побачите, що літерал не є завершеним. Тож має піти alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu

6

Ця команда працює для відображення і папок, і файлів .

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/"добре працює
патрокеет

3

Я чітко уточнюю висновок відповіді @ Хассу:

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/├/└/\''

BTW, treeнедоступний в таких умовах, як MinGW. Тож замінник корисний.


gitbash на windows не любить останній вираз, він говорить, що він не припиняється
Leos Literak

2

Ви також можете використовувати комбінацію команд find і awk для друку дерева каталогів. Докладніше див. У розділі " Як надрукувати багаторівневу структуру каталогу каталогів за допомогою комбінованих команд linux find and 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;
}}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.