aboutsummaryrefslogtreecommitdiff
path: root/sh/shrc.d/ud.sh
diff options
context:
space:
mode:
Diffstat (limited to 'sh/shrc.d/ud.sh')
-rw-r--r--sh/shrc.d/ud.sh42
1 files changed, 42 insertions, 0 deletions
diff --git a/sh/shrc.d/ud.sh b/sh/shrc.d/ud.sh
new file mode 100644
index 00000000..259f3167
--- /dev/null
+++ b/sh/shrc.d/ud.sh
@@ -0,0 +1,42 @@
+# Shortcut to step up the directory tree with an arbitrary number of steps,
+# like cd .., cd ../.., etc
+ud() {
+
+ # Change the positional parameters from the number of steps given to a
+ # "../../.." string
+ set -- "$(
+
+ # Check first argument, number of steps upward, default to 1
+ # "0" is weird, but valid; "-1" however makes no sense at all
+ steps=${1:-1}
+ if [ "$steps" -lt 0 ] ; then
+ printf >&2 'ud(): Invalid step count\n'
+ exit 2
+ fi
+
+ # Check second argument, target directory, default to $PWD
+ dirname=${2:-"$PWD"}
+
+ # Append /.. to the target the specified number of times
+ i=0
+ while [ "$i" -lt "$steps" ] ; do
+ dirname=${dirname%/}/..
+ i=$((i+1))
+ done
+
+ # Check we have a target after all that
+ if [ -z "$dirname" ] ; then
+ printf >&2 'ud(): Destination construction failed\n'
+ exit 1
+ fi
+
+ # Print the target
+ printf '%s\n' "$dirname"
+ )"
+
+ # If the subshell printed nothing, return with failure
+ [ -n "$1" ] || return
+
+ # Try to change into the determined directory
+ command cd -- "$@"
+}