लिनक्स शेल में दो निरपेक्ष पथों के सापेक्ष पथ की गणना कैसे करें?


17

हमारे पास दो रास्ते हैं। पहला एक निर्देशिका है, दूसरा या तो एक निर्देशिका या एक फ़ाइल है।

/a/b/c तथा /a/d/e.txt

प्रथम पथ से दूसरे तक सापेक्ष पथ होगा:

../../d/e.txt

लिनक्स टर्मिनल में गणना कैसे करें? उन लोगों के लिए जो पूछते हैं कि "उपयोग का मामला क्या है?"


1
यह माइग्रेट नहीं होना चाहिए था।

1
इसे डुप्लिकेट के रूप में बंद किया जाना चाहिए था।
अगली सूचना तक रोक दिया गया।

जवाबों:


10

GNU कोरुटिल्स मानकर:

  • सीमलिंक के लिए, lnहाल ही में --relativeविकल्प सीखा है ।

  • बाकी सब चीजों के लिए, realpathविकल्प का समर्थन करता है --relative-to=और --relative-base=


1
आप इसे बिजीबॉक्स के साथ कैसे करते हैं?
डेजुन

4

मेरे लिए, यह उत्तर (जो एक अजगर oneliner का उपयोग करता है) सही काम करता है।

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

मैक ओएसएक्स पर लिनक्स (कुबंटू 14.04) पर सफलतापूर्वक परीक्षण किया गया, जिसे पाइथन 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}"
}

दोनों रास्तों के सामान्य भाग को खोजने के लिए एक उप-भाग बनाता है। शायद आप इसे पसंद करते हैं - मेरे लिए काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.