Shell

cd 到符號連結文件的目錄

  • August 29, 2014

在我編寫腳本之前,任何人都知道執行以下操作的簡單方法:

$ pwd
/foo/bar
$ ls -l
lrwxr-xr-x  1 username  admin  48 Apr 17  2012 foo.sh -> /bar/foo.sh
$ cd /bar
$ ls
foo.sh

*即,*在目錄/foo/bar中,我想做類似cdl(cd link) 之類的操作,這會將我帶到連結文件的目錄(或者連結目錄,如果碰巧是這樣的話——如果是我可以輸入cd -P /bar)。

在 zsh 中,有一個修飾符,或者說是兩個:A解析符號連結(使用realpath)並h提取“頭”(即dirname)。

cd $file(:A:h)

這只有在符號沒有被破壞的情況下才有效。如果存在一串符號連結,則一直跟踪到最終目標。如果該目錄是通過符號連結到達的,那麼您將在其目標中(與 一樣cd -P)。


如果沒有 zsh,如果你有這個readlink實用程序,並且你想切換到包含符號連結目標的目錄:

cd -- "$(dirname -- "$(readlink -- "$file")")"

連結的目標本身可以是符號連結。如果要切換到包含連結最終目標的目錄,可以readlink循環呼叫:

while [ -L "$file" ]; do
 target=$(readlink -- "$file")
 while case $target in */) target=${target%/};; *) false;; esac; done
 case $target in
   */*) cd -- "${target%/*}"; target=${target#**/};;
 esac
done

在 Linux 上,假設符號連結沒有損壞,您可以使用readlink -f規範化路徑:

t=$(readlink -f -- "$file")
cd "${t%/*}"

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