9736299845ee9e916cd97f7ad621486a08f0bf73
[BK-2020-03.git] / unitproc / bkt-prune_path_rootside
1 #!/bin/bash
2
3 prune_path_rootside() {
4 # Desc: Prunes a path from the root-side to a specified prune level.
5 # Input: arg1 str path
6 # arg2 int prune level (0-indexed)
7 # Depends: GNU sed 4.8
8 # Version: 0.0.1
9 local path="$1";
10 local prune_level="$2";
11
12 # Check for absolute or relative path
13 if [[ "$path" =~ ^/ ]]; then
14 flag_root=true;
15 # Remove initial /
16 path="$(echo "$path" | sed -e 's:^/::' )";
17 else
18 flag_root=false;
19 fi;
20
21 # Save path as array with `/` as element delimiter
22 local IFS='/';
23 read -ra parts <<< "$path";
24
25 # Assemble pruned path from prune_level
26 local pruned_path="";
27 for (( i=prune_level; i<${#parts[@]}; i++ )); do
28 pruned_path+="${parts[i]}/";
29 done;
30
31 # Trim trailing `/` delimiter
32 pruned_path=$(echo "$pruned_path" | sed 's:/*$::');
33
34 # Restore initial / if appropriate
35 if [[ "$flag_root" == "true" ]] && [[ "$prune_level" -eq 0 ]]; then
36 pruned_path=/"$pruned_path";
37 fi;
38
39 # Output pruned path
40 echo "$pruned_path";
41 #declare -p path prune_level parts pruned_path && printf "========\n"; # debug
42 return 0;
43 }; # prune path rootside to int specified level
44
45 printf "========Test 1========\n";
46 prune_path_rootside "foo/bar/baz" 0;
47 prune_path_rootside "foo/bar/baz" 1;
48 prune_path_rootside "foo/bar/baz" 2;
49 prune_path_rootside "foo/bar/baz" 3;
50 printf "========Test 2========\n";
51 prune_path_rootside "/foo/bar/baz" 0;
52 prune_path_rootside "/foo/bar/baz" 1;
53 prune_path_rootside "/foo/bar/baz" 2;
54 prune_path_rootside "/foo/bar/baz" 3;