feat(unitproc/bkt-prune_path_rootside):Add Bash function
authorSteven Baltakatei Sandoval <baltakatei@gmail.com>
Wed, 17 Jul 2024 02:25:04 +0000 (02:25 +0000)
committerSteven Baltakatei Sandoval <baltakatei@gmail.com>
Wed, 17 Jul 2024 02:25:04 +0000 (02:25 +0000)
unitproc/bkt-prune_path_rootside [new file with mode: 0755]

diff --git a/unitproc/bkt-prune_path_rootside b/unitproc/bkt-prune_path_rootside
new file mode 100755 (executable)
index 0000000..9736299
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+prune_path_rootside() {
+    # Desc: Prunes a path from the root-side to a specified prune level.
+    # Input: arg1  str  path
+    #        arg2  int  prune level (0-indexed)
+    # Depends: GNU sed 4.8
+    # Version: 0.0.1
+    local path="$1";
+    local prune_level="$2";
+
+    # Check for absolute or relative path
+    if [[ "$path" =~ ^/ ]]; then
+        flag_root=true;
+        # Remove initial /
+        path="$(echo "$path" | sed -e 's:^/::' )";
+    else
+        flag_root=false;
+    fi;
+    
+    # Save path as array with `/` as element delimiter
+    local IFS='/';
+    read -ra parts <<< "$path";
+
+    # Assemble pruned path from prune_level
+    local pruned_path="";
+    for (( i=prune_level; i<${#parts[@]}; i++ )); do
+        pruned_path+="${parts[i]}/";
+    done;
+
+    # Trim trailing `/` delimiter
+    pruned_path=$(echo "$pruned_path" | sed 's:/*$::');
+
+    # Restore initial / if appropriate
+    if [[ "$flag_root" == "true" ]] && [[ "$prune_level" -eq 0 ]]; then
+        pruned_path=/"$pruned_path";
+    fi;
+
+    # Output pruned path
+    echo "$pruned_path";
+    #declare -p path prune_level parts pruned_path && printf "========\n"; # debug
+    return 0;
+}; # prune path rootside to int specified level
+
+printf "========Test 1========\n";
+prune_path_rootside "foo/bar/baz" 0;
+prune_path_rootside "foo/bar/baz" 1;
+prune_path_rootside "foo/bar/baz" 2;
+prune_path_rootside "foo/bar/baz" 3;
+printf "========Test 2========\n";
+prune_path_rootside "/foo/bar/baz" 0;
+prune_path_rootside "/foo/bar/baz" 1;
+prune_path_rootside "/foo/bar/baz" 2;
+prune_path_rootside "/foo/bar/baz" 3;