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

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.


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


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/-/|/'"'"

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.


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.