Shell

如何獲取兩個目錄之間的相對路徑?

  • June 25, 2021

假設我有一個帶有 path 的變數release/linux/x86,並且想要來自不同目錄(即../../..目前工作目錄)的相對路徑,我將如何在 shell 命令(或者可能是 GNU Make)中得到它?

不需要軟連結支持。


此問題已根據改進術語的公認答案進行了大量修改。

絕對不清楚它的目的,但這將完全按照要求使用GNU realpath

realpath -m --relative-to=release/linux/x86 .
../../..
realpath -m --relative-to=release///./linux/./x86// .
../../..

這是一個 shell 函式,它僅使用字元串操作返回從源目錄到目標目錄的相對路徑 - 通過 shell 參數擴展 - 沒有磁碟或網路訪問。沒有完成路徑名 解析

需要兩個參數,source-dir 和 target-dir,都是絕對規範化的非空路徑名,都可以是/- 結尾的,都不需要存在。如果為 void ,則返回 envar 中的結果$REPLY作為從源目錄到目標目錄的相對路徑,不帶尾隨。/``.

算法來自 2005 年 comp.unix.shell 的文章,該文章現已上升到archive.org

pnrelpath() {
   set -- "${1%/}/" "${2%/}/" ''               ## '/'-end to avoid mismatch
   while [ "$1" ] && [ "$2" = "${2#"$1"}" ]    ## reduce $1 to shared path
   do  set -- "${1%/?*/}/"  "$2" "../$3"       ## source/.. target ../relpath
   done
   REPLY="${3}${2#"$1"}"                       ## build result
   # unless root chomp trailing '/', replace '' with '.'
   [ "${REPLY#/}" ] && REPLY="${REPLY%/}" || REPLY="${REPLY:-.}"
}

用於

$ pnrelpath "$HOME" "$PWD"
projects/incubator/nspreon
$ pnrelpath "$PWD" "$gimpkdir"
../../../.config/GIMP
$ pnrelpath "$PWD" "$(cd "$dirnm" && pwd || false)"
# using cd to resolve, canonicalize ${dirnm}

或者,通過URI共享scheme://authority

$ pnrelpath 'https://example.com/questions/123456/how-to' 'https://example.com/media'
../../../media

引用自:https://unix.stackexchange.com/questions/573047