Shell

將相對路徑轉換為沒有符號連結的絕對路徑

  • February 18, 2019

是否有 Unix 命令可以從可能包含符號連結的相對路徑中獲取絕對(和規範化)路徑?

您可以使用該readlink實用程序,並帶有以下-f選項:

-f, --canonicalize

      canonicalize  by  following  every symlink in every component of
      the given name recursively; all  but  the  last  component  must
      exist

一些發行版,例如使用GNU coreutilsFreeBSD的發行版,還附帶一個realpath(1)實用程序,它基本上只是呼叫realpath(3)和執行幾乎相同的事情。

可移植的是,shell 將PWD變數設置為目前目錄的一個絕對位置。該路徑的任何組件都可能是符號連結。

case $f in
 /*) absolute=$f;;
 *) absolute=$PWD/$f;;
esac

如果您還想刪除.,請..切換到包含該文件的目錄並$PWD在那裡獲取:

if [ -d "$f" ]; then f=$f/.; fi
absolute=$(cd "$(dirname -- "$f")"; printf %s. "$PWD")
absolute=${absolute%?}
absolute=$absolute/${f##*/}

沒有可移植的方式來跟踪符號連結。如果你有一個目錄的路徑,那麼在大多數 unice 上都$(cd -- "$dir" && pwd -P 2>/dev/null || pwd)提供了一個不使用符號連結的路徑,因為跟踪符號連結的 shell 傾向於實現pwd -P(“P”代表“物理”)。

一些 unice 提供了一個實用程序來列印文件的“物理”路徑。

  • 相對較新的 Linux 系統(使用 GNU coreutils 或 BusyBox)有readlink -f,FreeBSD ≥8.3,NetBSD ≥4.0,OpenBSD 早在 2.2。
  • FreeBSD ≥4.3 有realpath(它也出現在一些 Linux 系統上,並且在 BusyBox 中)。
  • 如果 Perl 可用,您可以使用該Cwd模組
perl -MCwd -e 'print Cwd::realpath($ARGV[0])' path/to/file

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