web-dev-qa-db-ja.com

Linuxシェルで2つの絶対パスから相対パスを計算する方法は?

2つのパスがあります。 1つ目はディレクトリ、2つ目はディレクトリまたはファイルです。

/a/b/cおよび/a/d/e.txt

最初のパスから2番目のパスへの相対パスは次のようになります。

../../d/e.txt

Linux端末でそれを計算する方法は? 「使用例とは?」と質問する方へたとえば、これを使用して、多数の相対シンボリックリンクを作成できます。

18
Zebooka

GNU coreutils:

  • シンボリックリンクの場合、lnは最近--relativeオプションを学習しました。

  • それ以外の場合、realpathはオプション--relative-to=および--relative-base=をサポートします。

10
user1686

私にとって、 this 回答(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。

4
Joe

一貫して利用できないrealpathに依存せず、依存関係を最小限に抑えるために、これを思いつきました( this answer から少し助けを借りて):

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}"
}

両方のパスの共通部分を見つけるためにサブシェルを生成します。多分あなたはそれが好き-私のために働きます。

2
Pascal