Linux kabuğunda iki mutlak yoldan göreceli bir yol nasıl hesaplanır?


17

İki yolumuz var. Birincisi dizin, ikincisi bir dizin veya dosya.

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

Birinci yoldan ikinciye göreceli yol:

../../d/e.txt

Bunu Linux terminalinde nasıl hesaplayabilirim? “Kullanım durumu nedir?” Diye soranlar için bu, örneğin, çok sayıda göreceli sembol oluşturmak için kullanılabilir.


1
Bu taşınmamalıydı.

1
Bir kopya olarak kapatılmış olmalıdır.
sonraki duyuruya kadar duraklatıldı.

Yanıtlar:


10

GNU coreutils varsayımı:

  • Symlinks için, lnson zamanlarda --relativeseçeneği öğrendi .

  • Her şey için, realpathseçenekleri --relative-to=ve destekler --relative-base=.


1
BusyBox ile nasıl yapıyorsunuz?
DUzun

4

Benim için bu cevap (bir python oneliner kullanan) mükemmel çalışıyor.

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

Mac OSX'te linux (Kubuntu 14.04) ve üzerinde başarıyla test edilen Python 2.6'ya ihtiyaç duyuyor.


2

Bağlı değildir için realpatho sürekli kullanılamaz ve bağımlılıkları en aza indirmek, ben (biraz yardım kullanarak bu geldi bu cevap ):

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

Her iki yolun ortak kısmını bulmak için bir alt kabuk ortaya çıkarır. Belki beğenirsiniz - benim için çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.