Làm thế nào để tính toán một đường dẫn tương đối từ hai đường dẫn tuyệt đối trong shell Linux?


17

Chúng tôi có hai con đường. Đầu tiên là thư mục, thứ hai là một thư mục hoặc một tập tin.

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

Đường dẫn tương đối từ đường dẫn thứ nhất đến thứ hai sẽ là:

../../d/e.txt

Làm thế nào để tính toán điều đó trong thiết bị đầu cuối Linux? Đối với những người hỏi về trường hợp sử dụng là gì? Một người có thể sử dụng điều này, ví dụ như thế này để tạo ra nhiều liên kết tương đối.


1
Điều này không nên được di chuyển.

1
Nó đã được đóng lại như là một bản sao.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


10

Giả sử lõi core GNU:

  • Đối với symlink, lngần đây đã học được --relativetùy chọn.

  • Đối với mọi thứ khác, realpathhỗ trợ tùy chọn --relative-to=--relative-base=.


1
Làm thế nào để bạn làm điều đó với BusyBox?
DUzun

4

Đối với tôi, câu trả lời này (sử dụng một con trăn oneliner) hoạt động hoàn hảo.

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

Đã thử nghiệm thành công trên linux (Kubfox 14.04) và trên Mac OSX, cần Python 2.6.


2

Để không phụ thuộc vào realpathđiều đó không nhất quán và giảm thiểu sự phụ thuộc, tôi đã đưa ra điều này (sử dụng một chút trợ giúp từ câu trả lời này ):

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

Sinh ra một nhánh con để tìm phần chung của cả hai con đường. Có thể bạn thích nó - làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.