|
|
ltree - plstree - ps and ls displayed as a tree |
|
|
 |
git clone git://bitreich.org/plstree git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/plstree (git://bitreich.org) |
|
|
 |
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 │ └─ 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 } |
|