如何从Linux Shell中的两个绝对路径计算相对路径?


17

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

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

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

../../d/e.txt

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


1
这不应该被迁移。

1
应该将其作为副本关闭。
暂停,直到另行通知。

Answers:


10

假设GNU coreutils:

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

  • 对于其他所有内容,均realpath支持选项--relative-to=--relative-base=


1
如何使用BusyBox?
DUzun

4

对我来说,这个答案(使用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。


2

为了不依赖于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,以查找两个路径的公共部分。也许您喜欢它-为我工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.