Dizin yapısını bir ağaç şeklinde yazdırmak için Linux komutu


510

Dizin yapısını bir ağaç şeklinde yazdıracak bir Bash betiğinden çağırabileceğim herhangi bir linux komutu var mı, örneğin,

folder1
   a.txt
   b.txt
folder2
   folder3

7
Sadece koş find. Veya find . -not -path '*/\.*'ile başlayan dosya ve klasörleri gizlemek için .. Soruda olduğu gibi boşluklarla çıktı almak istiyorsanız, bu "daha güzel bul" komut dosyası ile kullanın: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]"
Kullanıcı

11
Bu tür sorular kapatılmak yerine SuperUser'a taşınmamalı mı?
Balmipour

12
Bu sorunun "konu dışı" olarak kapatılmayı hak ettiğini düşünmüyorum. Etiketler doğru görünüyor.
Sanket Berde

14
Göç etmeden soruları kapatma politikası hem yığın akışı hem de genel olarak insan bilgisi için zararlıdır. Son 3 gün içinde, aradığım ve karşılaştığım her soru benzer akıl yürütme nedeniyle kapatıldı ve daha fazla etkinlik gerçekleşemedi. Bu, hiç kimsenin güncelleyemeyeceği, hiç kimsenin daha iyi bir cevap veremeyeceği ve yığın akışının dar veya elitist görünmesini sağlar. Stackoverflow, bir konunun bu koşullara sahip olduğu tespit edildiğinde taşıma gerektirmeyi düşünmelidir.
Nay

5
@NickYeates ile aynı fikirdeyim, 2017'nin Eylül ayının sonlarında hala aynı soruya cevap buluyorum. Bu soru ve cevap politikalarını tasarlarken uzun vadeli düşünün!
Alex

Yanıtlar:


774

Aradığınız ağaç bu mu? Çoğu dağıtımda olmalıdır (belki isteğe bağlı kurulum olarak).

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

bakımcının web sayfasından alınan örnek.

Sen seçeneğini ekleyebilirsiniz maksimum yineleme derinliğini belirtmek için, bir sayı ile değiştirilir.-L ##

-dAyrıca dosyaları görüntülemek için kaldırın .


54
Bunu gören herhangi bir ziyaretçi için not: -ddosyaları görüntülemek için de kaldırın !
Afr

29
Bunu gören herhangi bir ziyaretçi için not: Man sayfası, sizin için daha fazla bayrak içeren bir kamyon yükü listeler :)
oivvio

43
Homebrew ile Mac OS X'e yüklemek için: brew install tree
funfuntime

2
apt-cyg install treeCygwin'e yüklemek için (apt-cyg yüklediğinizi varsayarak)
blockloop

2
Ubuntu 16.04 bile bununla birlikte gelmiyor. Kullanım apt-get install treekuracaktır.
Romeo Sierra

331

Bunu kullanabilirsiniz:

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

Mevcut alt dizinlerin birkaç saniye içinde dosyasız grafiksel bir temsilini gösterecektir , örneğin /var/cache/:

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

Kaynak


7
Daha fazla talep edilen OP gibi boşluklarla istiyorsanız, o zaman bu: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben

herhangi bir şekilde bunu dotfiles yoksay yapabilirsiniz? Örneğin .git?
GMA

Bkz @GeorgeMillo benim comment
kullanıcıyı


36
dosyaları ile: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff

18

Hassou'nun çözümünü .bashrc'nize eklemek için şunu deneyin:

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

6
Bunu doğrudan kopyalarsanız ilk satırın sonundaki satırsonu karakterine dikkat edin
Rahul

2
Güzel takma ad. Ama sonunda eksik '' (2 tek tırnak işareti) var. Onsuz bile çalışır, ama ... sonunda biraz daha komut eklemek isterseniz, hazır bilginin tamamlanmadığını göreceksiniz. Bu yüzden gitmeli alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu

7

Bu komut, klasörleri ve dosyaları görüntülemek için çalışır .

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

Örnek çıktı:

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

Kaynak: @javasheriff dan Açıklama burada . Bir yorum olarak batırılmış ve cevap olarak yayınlamak kullanıcıların kolayca fark etmesine yardımcı olur.


python3 için find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"iyi çalışıyor buldum
patroqueeet

3

@ Hassou'nun cevabının çıktısını şu şekilde hazırlıyorum:

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

Bu şu treeanki çıktıya çok benziyor :

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

Ayrıca bir takma ad da yapabilirsiniz:

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

BTW, treeMinGW gibi bazı ortamlarda mevcut değildir. Yani alternatif yardımcı olur.


pencerelerde gitbash son ifadeyi sevmiyor, sonlandırılmadığını söylüyor
Leos Literak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.