ltree - plstree - ps and ls displayed as a tree | |
git clone git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
--- | |
ltree (2739B) | |
--- | |
1 #!/usr/bin/awk -f | |
2 | |
3 # list paths in a tree with some stat infos | |
4 | |
5 # Use find(1) walk the entire tree and then call ls -ld with all the | |
6 # result (ls sort the list itself) with the paths displayed as a tree: | |
7 # | |
8 # drwxr-xr-x 2 josuah josuah 512 Feb 16 13:19 ├─ .ssh | |
9 # -rw-r--r-- 1 josuah josuah 870 Feb 9 02:24 │ └─… | |
10 # drwxr-xr-x 2 josuah josuah 1536 Feb 18 21:24 ├─ bin | |
11 # -rwxr-xr-x 1 josuah josuah 1351 Feb 18 22:30 │ ├─… | |
12 # -rwxr-xr-x 1 josuah josuah 565 Feb 17 19:53 │ ├─… | |
13 # -rwxr-xr-x 1 josuah josuah 5430 Feb 17 19:51 │ └─… | |
14 # -rwxr-xr-x 1 josuah josuah 468 Feb 17 19:55 ... | |
15 | |
16 BEGIN { | |
17 LINE = "│ "; | |
18 NODE = "├─ "; | |
19 TAIL = "└─ "; | |
20 VOID = " "; | |
21 | |
22 num = list(entries, ARGC == 1 ? "." : ARGV[1]); | |
23 tree(entries, num); | |
24 | |
25 for (l = 1; l <= num; l++) { | |
26 for (i = 1; entries[l":"i] != ""; i++) | |
27 printf("%s", entries[l":"i]); | |
28 printf("%s\n", entries[l"name"]); | |
29 } | |
30 } | |
31 | |
32 # Get a recursive list of all entries into entries[] with entries[i:j] | |
33 # holding the component j of the path i, and 0 has all the -l details, | |
34 # then return the number of entries in entries[]. | |
35 # | |
36 # [ 1:[ 0:"-rw-r--r-- 1 root root 341 Mar 13 10:50", | |
37 # 1:"etc" ], | |
38 # 2:[ 0:"drwxr-xr-x 28 root root 4096 Mar 13 10:50", | |
39 # 1:"etc", | |
40 # 2:"sv" ], | |
41 # 3:[ 0:"drwxr-xr-x 2 root root 4096 Mar 13 10:50", | |
42 # 1:"etc", | |
43 # 2:"tor" ] ] | |
44 # | |
45 # Only the leaves are present, the intermediates components are LINE or | |
46 # NODE if just before a leave | |
47 # | |
48 # [ 1:[ 1:LINE, 2:LINE, 3:LINE, 4:LINE, 5:NODE, 6:"filename" ] ] | |
49 | |
50 function list(entries, path) | |
51 { | |
52 cmd = "cd '" path "' && exec find ." … | |
53 " -name '*.git' -prune -o" … | |
54 " -name 'CVS' -prune -o" … | |
55 " -exec ls -ld {} +"; | |
56 | |
57 for (num = 0; cmd | getline; num++) { | |
58 sub(" \\.$", "", $0); | |
59 sub(" -> .*", "", $0); | |
60 infos = $0; | |
61 sub(" \\./.*", "", infos); | |
62 sub(".* \\./", "./", $0); | |
63 | |
64 entries[num"path"] = $0; | |
65 count = split($0, path_v, "/"); | |
66 for (i = 2; i < count; i++) | |
67 entries[num":"i] = LINE; | |
68 | |
69 entries[num":"count] = NODE; | |
70 entries[num":"1] = infos " "; | |
71 entries[num"name"] = path_v[count]; | |
72 } | |
73 close(cmd); | |
74 | |
75 return num - 1; | |
76 } | |
77 | |
78 # Transform entries into a tree by replacing some LINE by VOID when need… | |
79 # The tree is walked from the bottom to the top, and column by column | |
80 # toward the right until an empty column is met. | |
81 | |
82 function tree(entries, num) | |
83 { | |
84 for (i = 2; !stop; i++) { | |
85 stop = tail = 1; | |
86 for (l = num; l > 0; l--) { | |
87 if (entries[l":"i] == LINE && tail) { | |
88 entries[l":"i] = VOID; | |
89 stop = 0; | |
90 } else if (entries[l":"i] == NODE && tail) { | |
91 entries[l":"i] = TAIL; | |
92 tail = stop = 0; | |
93 } else if (!entries[l":"i]) { | |
94 tail = 1; | |
95 } | |
96 } | |
97 } | |
98 } |