When I was working on a Terminal, I used to type lots of cd and cd .. to go back and forth the directory. Too often, when I went to deep into the directory hierarchy, I got to type multiple times cd .. just to move up to parents, or a long command like cd ../../../../../.
I got frustrated every freaking time doing this, so I thought of an more easy way to type once and it got me to the correct directory up in the hierarchy, I call the alias two-dots.
| |
How it works:
| |
If you want to more enhanced version of back() such that typing .. 6 or .. that will produce the same result, you can check out my Gist:
| #!/usr/bin/env bash | |
| #---------- | |
| # back | |
| # Goes back to parent directory quicker. | |
| # | |
| # NUMBER - goes back to x levels by repeatedly calling `cd ..`. | |
| # SUBPATH - a segment of a full path to go back. | |
| # | |
| # *KNOWN LIMITS* | |
| # - If the segment is a number, say 1234, use `back '/1234'`. | |
| # - If there are more than one occurences of the segment in the full path, | |
| # the first one will be used. | |
| back() { | |
| local target="${1:-1}" | |
| local full_path="$(pwd)" | |
| # If the argument is a number, treat it as how many level or parents | |
| # to go back to. | |
| if [[ "$target" =~ ^[[:digit:]].*$ ]] | |
| then | |
| for x in {1..${target}} | |
| do | |
| cd .. | |
| done | |
| return 0 | |
| else | |
| # If the argument is not a number, test if it is a segment in the path | |
| # of the current directory. | |
| # If it is, then calculate the path to the argument and then | |
| # simply cd to it. | |
| if [[ "${full_path}" == *"${target}"* ]] | |
| then | |
| # Implementation note: | |
| # Suppose the path is this/is/a/long/directory/path and the argument is `long`. | |
| # First we need to find the path starting after the argument `directory/path` by | |
| # using Bash Sub-string removal `${full_path##*target}`. | |
| # Then we substract that path to the full path to have the path to the argument. | |
| local trailing="${full_path##*${target}}" | |
| local target_path="${full_path%${trailing}*}" | |
| cd "${target_path}" | |
| # cd "${full_path%${target}*}/${target}" | |
| return 0 | |
| else | |
| echo "error - cannot back to ${target} as it does not exist" | |
| fi | |
| return 1 | |
| fi | |
| } | |
| back "$@" |