Perintah Linux untuk mencetak struktur direktori dalam bentuk pohon

510

Apakah ada perintah linux yang bisa saya panggil dari skrip Bash yang akan mencetak struktur direktori dalam bentuk pohon, misalnya,

folder1
   a.txt
   b.txt
folder2
   folder3
pengguna243655
sumber
7
Lari saja find. Atau find . -not -path '*/\.*'untuk menyembunyikan file dan folder yang dimulai dengan .. Jika Anda ingin memiliki keluaran dengan spasi, seperti dalam pertanyaan, gunakan dengan skrip "find prettifier" ini: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]"
pengguna
11
Bukankah seharusnya pertanyaan seperti itu dimigrasikan ke SuperUser daripada ditutup?
Balmipour
12
Saya tidak berpikir pertanyaan ini layak ditutup sebagai "di luar topik". Tag tampaknya benar.
Sanket Berde
14
Kebijakan menutup pertanyaan tanpa migrasi berbahaya bagi stackoverflow dan pengetahuan manusia secara umum. Dalam 3 hari terakhir, setiap pertanyaan yang saya teliti dan temui ditutup untuk alasan yang sama, dan tidak ada lagi kegiatan yang dapat terjadi. Ini berarti tidak ada yang bisa memperbaruinya, tidak ada yang bisa memberikan jawaban yang lebih baik, dan itu membuat stackoverflow terlihat picik atau elitis. Stackoverflow harus mempertimbangkan memerlukan migrasi ketika topik ditemukan memiliki kondisi ini.
Tidak,
5
Saya setuju dengan @NickYeates Saya di sini pada akhir September 2017 masih menemukan jawaban untuk pertanyaan yang sama ini. Pikirkan jangka panjang ketika kita merancang kebijakan tanya jawab ini!
Alex

Jawaban:

774

Apakah ini yang Anda cari pohon ? Itu harus di sebagian besar distribusi (mungkin sebagai instalasi opsional).

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

sampel diambil dari halaman web pengelola.

Anda dapat menambahkan opsi di -L #mana #diganti dengan angka, untuk menentukan kedalaman rekursi maksimum.

Hapus -djuga untuk menampilkan file.

licik
sumber
54
Catatan untuk setiap pengunjung yang melihat ini: hapus juga -duntuk menampilkan file!
Afr
29
Catatan untuk setiap pengunjung yang melihat ini: Halaman manual berisi truk berisi lebih banyak bendera untuk Anda :)
oivvio
43
Untuk menginstal di Mac OS X dengan Homebrew: brew install tree
funfuntime
2
Untuk menginstal di cygwin apt-cyg install tree(dengan asumsi Anda telah menginstal apt-cyg)
blockloop
2
Bahkan Ubuntu 16.04 tidak disertai dengan ini. Gunakan apt-get install treeakan menginstalnya.
Romeo Sierra
331

Anda bisa menggunakan ini:

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

Ini akan menampilkan representasi grafis dari sub-direktori saat ini tanpa file dalam beberapa detik , misalnya dalam /var/cache/:

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

Sumber

Soufiane Hassou
sumber
7
Jika Anda menginginkannya dengan spasi, lebih seperti OP yang diminta, maka ini: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben
Bagaimana saya bisa membuat ini mengabaikan dotfiles? Misalnya mencegahnya dari daftar isi .git?
GMA
@ GeorgeMillo lihat komentar saya
pengguna
32
Tidak mencetak file.
Tomáš Zato - Reinstate Monica
36
dengan file: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff
18

Untuk menambahkan solusi Hassou ke .bashrc Anda, coba:

alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/   /'"'"' -e '"'"'s/-/|/'"'"
RussellStewart
sumber
6
Waspadalah terhadap karakter baris baru pada akhir baris pertama jika menyalin ini secara langsung
Rahul
2
Alias ​​bagus. Tapi ada yang hilang '' (2 karakter kutipan tunggal) di akhir. Ini berfungsi bahkan tanpa itu, tetapi ... jika Anda ingin menambahkan beberapa perintah lagi pada akhirnya Anda akan melihat literal tidak lengkap. Jadi itu harus pergi alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Pahlawan Qu
7

Perintah ini berfungsi untuk menampilkan folder dan file .

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

Contoh output:

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

Sumber: Komentar dari @javasheriff di sini . Ini terendam sebagai komentar dan mempostingnya sebagai jawaban membantu pengguna menemukannya dengan mudah.

Pavan Kumar
sumber
untuk python3 saya menemukan find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"bekerja dengan baik
patroqueeet
3

Saya menyiapkan output dari jawaban @ Hassou dengan:

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

Ini seperti output dari treesekarang:

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

Anda juga dapat membuat alias:

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

BTW, treetidak tersedia di beberapa lingkungan, seperti MinGW. Jadi alternatifnya sangat membantu.

Robert
sumber
gitbash pada windows tidak menyukai ekspresi terakhir, ia mengatakan bahwa itu tidak dihentikan
Leos Literak