Bagaimana cara menghitung jalur relatif dari dua jalur absolut di Linux shell?

17

Kami memiliki dua jalur. Yang pertama adalah direktori, kedua direktori atau file.

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

Jalur relatif dari jalur pertama ke kedua adalah:

../../d/e.txt

Bagaimana cara menghitungnya di terminal Linux? Bagi mereka yang bertanya "Apa itu kasus penggunaan?" Orang bisa menggunakan ini — misalnya — untuk membuat banyak symlink relatif.

techraf
sumber
1
Ini seharusnya tidak dimigrasi.
1
Seharusnya ditutup sebagai duplikat.
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

10

Dengan asumsi GNU coreutils:

  • Untuk symlink, lnbaru-baru ini mempelajari --relativeopsi.

  • Untuk yang lainnya, realpathmendukung opsi --relative-to=dan --relative-base=.

pengguna1686
sumber
1
Bagaimana Anda melakukannya dengan BusyBox?
DUzun
4

Bagi saya, jawaban ini (yang menggunakan oneliner python) berfungsi sempurna.

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

Diuji berhasil di linux (Kubuntu 14.04) dan di Mac OSX, perlu Python 2.6.

Joe
sumber
2

Untuk tidak bergantung pada realpathyang tidak tersedia secara konsisten dan meminimalkan ketergantungan, saya datang dengan ini (menggunakan sedikit bantuan dari jawaban ini ):

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

Menumbuhkan subkulit untuk menemukan bagian umum dari kedua jalur. Mungkin Anda menyukainya - bekerja untuk saya.

Pascal
sumber