relative_path.sh
40 lines
| 1.0 KiB
| application/x-sh
|
BashLexer
/ scripts / relative_path.sh
pellion
|
r133 | #!/bin/bash | ||
# both $1 and $2 are absolute paths (biginning with /) | ||||
# returns $2 relative to $1 | ||||
source=$1 | ||||
target=$2 | ||||
common_part=$source # for now | ||||
result="" # for now | ||||
while [[ "${target#$common_part}" == "${target}" ]]; do | ||||
# no match, means that candidate common part is not correct | ||||
# go up one level (reduce common part) | ||||
common_part="$(dirname $common_part)" | ||||
# and record that we went back, with correct / handling | ||||
if [[ -z $result ]]; then | ||||
result=".." | ||||
else | ||||
result="../$result" | ||||
fi | ||||
done | ||||
if [[ $common_part == "/" ]]; then | ||||
# special case for root (no common path) | ||||
result="$result/" | ||||
fi | ||||
# since we now have identified the common part, | ||||
# compute the non-common part | ||||
forward_part="${target#$common_part}" | ||||
# and now stick all parts together | ||||
if [[ -n $result ]] && [[ -n $forward_part ]]; then | ||||
result="$result$forward_part" | ||||
elif [[ -n $forward_part ]]; then | ||||
# extra slash removal | ||||
result="${forward_part:1}" | ||||
fi | ||||
echo $result | ||||