Lệnh Linux để in cấu trúc thư mục dưới dạng cây


510

Có lệnh linux nào mà tôi có thể gọi từ tập lệnh Bash sẽ in cấu trúc thư mục dưới dạng cây không, ví dụ:

folder1
   a.txt
   b.txt
folder2
   folder3

7
Cứ chạy đi find. Hoặc find . -not -path '*/\.*'để ẩn các tập tin và thư mục bắt đầu với .. Nếu bạn muốn có đầu ra có khoảng trắng, như trong câu hỏi, hãy sử dụng nó với tập lệnh "find prettifier" này: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]"
người dùng

11
Những câu hỏi như vậy có nên được chuyển sang SuperUser chứ không phải đóng không?
Balmipour

12
tôi không nghĩ câu hỏi này xứng đáng được đóng lại là "lạc đề". Các thẻ dường như là đúng.
Sanket Berde 1/12/2015

14
Chính sách đóng câu hỏi mà không di chuyển có hại cho cả stackoverflow và kiến ​​thức của con người nói chung. Trong 3 ngày qua, mọi câu hỏi mà tôi đã hỏi và gặp phải đều bị đóng cửa vì lý do tương tự, và không có hoạt động nào có thể xảy ra nữa. Điều này có nghĩa là không ai có thể cập nhật nó, không ai có thể đưa ra câu trả lời tốt hơn, và nó làm cho stackoverflow trông thiển cận hoặc tinh hoa. Stackoverflow nên xem xét yêu cầu di chuyển khi một chủ đề được tìm thấy có các điều kiện này.
Nay

5
Tôi đồng ý với @NickYeates Tôi ở đây vào cuối tháng 9 năm 2017 vẫn đang tìm câu trả lời cho cùng câu hỏi này. Hãy suy nghĩ lâu dài khi chúng tôi thiết kế các chính sách câu hỏi và trả lời!
Alex

Câu trả lời:


774

Đây có phải là những gì bạn đang tìm kiếm cây ? Nó nên có trong hầu hết các bản phân phối (có thể là một cài đặt tùy chọn).

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

mẫu lấy từ trang web của người bảo trì.

Bạn có thể thêm tùy chọn -L #nơi #được thay thế bằng một số, để chỉ định độ sâu đệ quy tối đa.

Xóa -dđể hiển thị tập tin.


54
Lưu ý cho bất kỳ khách truy cập nào nhìn thấy điều này: loại bỏ -dđể hiển thị các tập tin cũng!
Afr

29
Lưu ý cho bất kỳ khách truy cập nào nhìn thấy điều này: Trang người đàn ông liệt kê một xe tải nhiều cờ hơn cho bạn :)
oivvio

43
Để cài đặt trên Mac OS X w / Homebrew: brew install tree
funf.78 23/12/14

2
Để cài đặt trên cygwin apt-cyg install tree(giả sử bạn đã cài đặt apt-cyg)
blockloop

2
Ngay cả Ubuntu 16.04 cũng không đi kèm với điều này. Sử dụng apt-get install treesẽ cài đặt nó.
Romeo Sierra

331

Bạn có thể sử dụng cái này:

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

Nó sẽ hiển thị biểu diễn đồ họa của các thư mục con hiện tại không có tệp trong vài giây , ví dụ /var/cache/:

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

Nguồn


7
Nếu bạn muốn nó có khoảng trắng, giống như OP yêu cầu, thì đây: ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
Ben

bất kỳ cách nào tôi có thể làm cho điều này bỏ qua dotfiles? Ví dụ ngăn nó liệt kê nội dung của .git?
GMA


32
Không in tập tin.
Tomáš Zato - Phục hồi Monica

36
với các tệp: find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
JavaSheriff

18

Để thêm giải pháp của Hassou vào .bashrc của bạn, hãy thử:

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

6
Cảnh giác với ký tự dòng mới ở cuối dòng đầu tiên nếu sao chép trực tiếp ký tự này
Rahul

2
Bí danh tốt đẹp. Nhưng vẫn còn thiếu '' (2 ký tự trích dẫn) ở cuối. Nó hoạt động ngay cả khi không có nó, nhưng ... nếu bạn muốn thêm một số lệnh nữa vào cuối, bạn sẽ thấy nghĩa đen là không hoàn thành. Vì vậy, nó nên đi alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
Hero Qu

7

Lệnh này hoạt động để hiển thị cả thư mục và tập tin .

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

Ví dụ đầu ra:

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

Nguồn: Nhận xét từ @javasheriff tại đây . Nó chìm dưới dạng một bình luận và đăng nó dưới dạng câu trả lời giúp người dùng dễ dàng nhận ra nó.


cho python3 tôi thấy find . |grep -vE 'pyc|swp|__init' | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"làm việc tốt
patroqueeet

3

Tôi đang chuẩn bị đầu ra cho câu trả lời của @ Hassou với:

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

Điều này giống như đầu ra của treebây giờ:

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

Bạn cũng có thể tạo một bí danh của nó:

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

BTW, treekhông có sẵn trong một số môi trường, như MinGW. Vì vậy, sự thay thế là hữu ích.


gitbash trên windows không thích biểu thức cuối cùng, nó nói rằng nó không bị chấm dứt
Leos Literak

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.