Shell
將相對路徑轉換為沒有符號連結的絕對路徑
是否有 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 coreutils和FreeBSD的發行版,還附帶一個
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