在 Linux shell 中,如何根据两个绝对路径计算出一个相对路径?

在 Linux shell 中,如何根据两个绝对路径计算出一个相对路径?

我们有两条路径。第一条路径是目录,第二条路径可以是目录或文件。

/a/b/c/a/d/e.txt

从第一条路径到第二条路径的相对路径将是:

../../d/e.txt

如何在 Linux 终端中计算?对于那些问“用例是什么?”的人来说,例如,可以使用它来创建大量相对符号链接。

答案1

假设 GNU coreutils:

  • 对于符号链接,ln最近了解了该--relative选项。

  • 对于其他一切,realpath支持选项--relative-to=--relative-base=

答案2

为我,答案(使用 python oneliner)效果很好。

$ python -c "import os.path; print os.path.relpath('/a/d/e.txt', '/a/b/c')"
../../d/e.txt

在 Linux(Kubuntu 14.04)和 Mac OSX 上测试成功,需要 Python 2.6。

答案3

为了不依赖于realpath那些不稳定的资源,并尽量减少依赖,我想到了这个(借助这个答案):

function relative_path_from_to() {
  # strip trailing slashes
  path1=${1%\/}
  path2=${2%\/}
  # common part of both paths
  common=$(printf '%s\x0%s' "${path1}" "${path2}" | sed 's/\(.*\/\).*\x0\1.*/\1/')
  # how many directories we have to go up to the common part
  up=$(grep -o "/" <<< ${path1#$common} | wc -l)
  # create a prefix in the form of ../../ ...
  prefix=""; for ((i=0; i<=$up; i++)); do prefix="$prefix../"; done
  # return prefix plus second path without common
  printf "$prefix${2#$common}"
}

生成一个子 shell 来查找两个路径的公共部分。希望你喜欢它 - 对我来说很有用。

相关内容