วิธีการคำนวณเส้นทางสัมพัทธ์จากสองเส้นทางแน่นอนใน Linux shell?


17

เรามีสองเส้นทาง อันแรกคือไดเรกทอรีรองทั้งไดเรกทอรีหรือไฟล์

/a/b/c และ /a/d/e.txt

เส้นทางสัมพัทธ์จากเส้นทางแรกไปที่สองจะเป็น:

../../d/e.txt

วิธีคำนวณในเทอร์มินัล Linux? สำหรับผู้ที่ถามว่า "กรณีการใช้งานคืออะไร" ใครสามารถใช้สิ่งนี้ - ตัวอย่างเช่น - เพื่อสร้าง symlink แบบสัมพัทธ์จำนวนมาก


1
ไม่ควรย้ายข้อมูลนี้

คำตอบ:


10

สมมติว่า coreutils ของ GNU:

  • สำหรับ symlink 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.