คำสั่ง Linux เพื่อพิมพ์โครงสร้างไดเร็กทอรีในรูปแบบแผนผัง


510

มีคำสั่ง linux ที่ฉันสามารถโทรจาก Bash script ที่จะพิมพ์โครงสร้างไดเรกทอรีในรูปแบบของต้นไม้เช่น

folder1
   a.txt
   b.txt
folder2
   folder3

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]"
ผู้ใช้

11
ไม่ควรย้ายคำถามดังกล่าวไปยัง SuperUser แทนที่จะปิด
Balmipour

12
ฉันไม่คิดว่าคำถามนี้ควรปิดเป็น "ปิดหัวข้อ" แท็กดูเหมือนจะถูกต้อง
Sanket Berde

14
นโยบายการปิดคำถามโดยไม่มีการโยกย้ายเป็นอันตรายต่อทั้ง stackoverflow และความรู้ทั่วไปของมนุษย์ ในช่วง 3 วันที่ผ่านมาทุกคำถามที่ฉัน googled และเจอก็ถูกปิดด้วยเหตุผลที่คล้ายกันและไม่มีกิจกรรมที่สามารถเกิดขึ้นได้ ซึ่งหมายความว่าไม่มีใครสามารถอัปเดตไม่มีใครสามารถให้คำตอบที่ดีกว่าและทำให้ stackoverflow ดูสั้นลงหรือมีชนชั้นนำ Stackoverflow ควรพิจารณากำหนดให้มีการย้ายข้อมูลเมื่อพบว่าหัวข้อมีเงื่อนไขเหล่านี้
Nay

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
หมายเหตุสำหรับผู้เข้าชมที่เห็นสิ่งนี้: หน้า man จะแสดงรายการรถบรรทุกสำหรับธงเพิ่มเติมสำหรับคุณ :)
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จะติดตั้งมัน
Romeo Sierra

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/^/ /'
Ben

ด้วยวิธีใดฉันสามารถทำให้สิ่งนี้ละเว้น dotfiles ได้? เช่นป้องกันไม่ให้แสดงเนื้อหาของ.git?
GMA


32
ไม่พิมพ์ไฟล์
Tomáš Zato - Reinstate Monica

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
ระวังอักขระขึ้นบรรทัดใหม่ที่ท้ายบรรทัดแรกหากคัดลอกโดยตรง
Rahul

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

BTW treeไม่สามารถใช้ได้ในบางสภาพแวดล้อมเช่น MinGW ดังนั้นทางเลือกจึงมีประโยชน์


gitbash บน windows ไม่ชอบการแสดงออกครั้งสุดท้ายมันบอกว่ามันไม่ได้ถูกยกเลิก
Leos Literak

2

คุณยังสามารถใช้การรวมกันของคำสั่ง 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;
}}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.