ltree - plstree - ps and ls displayed as a tree
(HTM) git clone git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) 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 │ └─ config
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 │ ├─ lt
12 # -rwxr-xr-x 1 josuah josuah 565 Feb 17 19:53 │ ├─ mfilter
13 # -rwxr-xr-x 1 josuah josuah 5430 Feb 17 19:51 │ └─ xdg-open
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 needed.
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 }