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


17

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

/a/b/c そして /a/d/e.txt

最初のパスから2番目のパスへの相対パスは次のとおりです。

../../d/e.txt

Linuxターミナルでそれを計算する方法は?「使用例とは何ですか?」


1
これは移行されるべきではありません。

1
重複して閉じられている必要があります。
追って通知があるまで一時停止します。

回答:


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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.